#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std;
const int MAXN=6005;
vector<int> e[MAXN];
int n,r[MAXN],f[MAXN][2],u,v,b[MAXN];
void dp(int x){
for(int i=0;i<e[x].size();i++){
dp(x); //递归到叶子节点
int k=e[x][i];
f[x][0]=max(f[k][1],f[k][0]); //x不去
f[x][1]+=f[k][0]; //x去
}
f[x][1]+=r[x];
}
int main(){
ios::sync_with_stdio(false);
cin.tie(NULL);cout.tie(NULL);
cin>>n;
for(int i=1;i<=n;i++) cin>>r[i];
for(int i=1;i<n;i++){
cin>>u>>v;
b[v]++;e[u].push_back(v);
}
for(int i=1;i<=n;i++){
if(!b[i]){
dp(i);
cout<<max(f[i][0],f[i][1]);
break;
}
}
return 0;
}