//树形动态规划
#include<iostream>
#include<vector>
using namespace std;
int n;
int w[100000+5]={0};
int vis[100000+5]={0};
int dp[100000+5][2]={0};
vector<int> G[100000+5];
void gcd(int x){
vis[x]=1;
for(int i=0;i<G[x].size();i++){
int e=G[x][i];//选择的点
if(vis[e]) continue;
gcd(e);
dp[x][1]+=dp[e][0];
dp[x][0]+=max(dp[e][1],dp[e][0]);
// dp[x][1]+=dp[e][0];
}
dp[x][1]+=w[x];
}
int main()
{
cin>>n;
int x,y;
for(int i=1;i<=n;i++) cin>>w[i];
for(int i=1;i<=n;i++) G[i].clear();
for(int i=0;i<n-1;i++) {
cin>>x>>y;
G[x].push_back(y);
G[y].push_back(x);
}
gcd(1);
cout<<max(dp[1][0],dp[1][1])<<endl;
return 0;
}