#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
using namespace std;
int z[6001],f[6001][6001],cnt,v[6001],next[6001],poor[6001],n; bool q[6001];
void sta(int father,int son){
cnt++;
v[cnt]=son;
next[cnt]=poor[father];
poor[father]=cnt;
}
int DP(int node){
int i;
for(i=poor[node];i!=0;i=next[i]){
DP(v[i]);
}
for(i=poor[node];i!=0;i=next[i]){
f[node][0]+=max(f[v[i]][1],f[v[i]][0]);
f[node][1]+=f[v[i]][0];
}
f[node][1]+=z[node];
}
int main(){
int i,New,l,r;
scanf("%d%d",&n);
for(i=1;i<=n;i++) scanf("%d",&z[i]);
for(i=1;i<n;i++){
scanf("%d%d",&l,&r);
q[l]=true;
sta(r,l);
}
for(i=1;i<=n;i++)
if(q[i]==false){
New=i;
break;
}
DP(New);
printf("%d",max(f[New][1],f[New][0]));
return 0;
}