#include<iostream>
#include<cstring>
#include<cstdio>
using namespace std;
int n;
const int maxn=6e3+5;
int ans=-2147483648;
struct node
{
int u;
int v;
int nxt;
};
int a[maxn];
int h[maxn];
node edge[maxn];
int dp[maxn][2];
int fa[maxn];
int tot=0;
void add(int u,int v)
{
edge[++tot].u=u;
edge[tot].v=v;
edge[tot].nxt=h[u];
h[u]=tot;
}
void dfs(int i)
{
dp[i][0]=0;
dp[i][1]=a[i];
for(int k=h[i];k!=-1;k=edge[k].nxt)
{
int j=edge[k].v;
dfs(j);
dp[k][0]+=max(dp[j][0],dp[j][1]);
dp[k][1]+=dp[j][0];
}
}
int main()
{
memset(h,-1,sizeof(h));
scanf("%d",&n);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
int k,l;
for(int i=0;i<n-1;i++)
{
scanf("%d%d",&l,&k);
add(k,l);
fa[l]=k;
}
int root=0;
for(int i=1;i<=n;i++)
{
if(fa[i]==0)
{
root=i;
break;
}
}
dfs(root);
ans=max(dp[root][0],dp[root][1]);
cout<<ans<<endl;
return 0;
}