#include<bits/stdc++.h>
using namespace std;
struct edge{
int to,nxt;
}e[1100010];
bool vis[1090001],bz[1000001];
int n,m,head[1000110],len,f[1000011][2];
void add(int u,int v){
e[++len].nxt=head[u];
e[len].to=v;
head[u]=len;
}
void dfs(int u){
vis[u]=1;
for(int i=head[u];i ;i=e[i].nxt){
if(vis[e[i].to])continue;
dfs(e[i].to);
f[u][1]+=max(f[e[i].to][1],f[e[i].to][0]);
f[u][0]+=f[e[i].to][0];
}
}
int u,v;
int main(){
cin>>n;
for(int i=1;i<=n;++i){
cin>>f[i][1];
}
for(int i=1;i<n;++i){
cin>>u>>v;
bz[u]=1;
add(v,u);
}
for(int i=1;i<=n;++i){
if(!bz[i]){
dfs(i);
cout<<max(f[i][1],f[i][0]);
return 0;
}
}
}
//最后一个点给的是负数,我这个打法答案是负数好像不太行