#include<bits/stdc++.h>
using namespace std;
const int maxn=6e3+5;
int n,a[maxn],fa[maxn],root,nxt[maxn],dp[maxn][2];
vector<int> Tree[maxn];
int dfs(int x,bool y){
int a1=0,a2=0;
for(int i=0,len=Tree[x].size();i<len;++i){
a1+=dfs(Tree[x][i],1);
if(y)
a2+=dfs(Tree[x][i],0);
}
dp[x][y]=a1;
if(y)
dp[x][y]=max(dp[x][y],a2+a[x]);
return dp[x][y];
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)
scanf("%d",&a[i]);
memset(fa,-1,sizeof(fa));
for(int i=1,x,y;i<n;++i){
scanf("%d%d",&x,&y);
Tree[y].push_back(x);
fa[x]=y;
}
for(int i=1;i<=n;++i)
if(fa[i]==-1){
root=i;
break;
}
printf("%d\n",dfs(root,1));
return 0;
}