#include <bits/stdc++.h>
#define int long long
using namespace std;
int n,r[6010],num[6010],cnt,head[6010],s,dp[6010][2],ans;
struct su{
int nxt,to;
};
su edge[6010];
void add(int u,int v){
edge[++cnt].nxt=head[u];
edge[cnt].to=v;
head[u]=cnt;
}
void dfs(int u,int fa){
dp[u][1]=r[u];
for(int i=head[u];i;i=edge[i].nxt){
int v=edge[i].to;
if(v==fa){
continue;
}
dfs(v,u);
dp[u][0]=max(dp[v][1],dp[v][0]);
dp[u][1]+=dp[v][0];
}
return;
}
signed main()
{
cin>>n;
for(int i=1;i<=n;i++){
cin>>r[i];
}
for(int i=1;i<=n-1;i++){
int u,v;
cin>>u>>v;
add(u,v);
add(v,u);
num[u]++;
}
for(int i=1;i<=n;i++){
if(num[i]==0){
s=i;
break;
}
}
dfs(s,0);
for(int i=1;i<=n;i++){
ans=max(ans,max(dp[i][0],dp[i][1]));
}
cout<<ans;
return 0;
}