#include<bits/stdc++.h>
using namespace std;
int n;
int r[10010];
int dp[10010][10010];
struct node{
int to,next;
}edge[10010];
int head[10010];
int cnt;
void add(int u,int v)
{
edge[++cnt].to=v;
edge[cnt].next=head[u];
head[u]=cnt;
}
void dfs(int x)
{
for(int i=head[x];i;i=edge[i].next)
{
int y=edge[i].to;
dfs(y);
dp[x][0]+=max(dp[y][0],dp[y][1]);
dp[x][1]+=dp[y][0];
}
}
int main()
{
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>r[i];
}
for(int i=1;i<n;i++)
{
int l,k;
cin>>l>>k;
add(k,l);
}
for(int i=1;i<=n;i++)
{
dp[i][1]=r[i];
}
dfs(1);
int ans;
for(int i=1;i<=n;i++)
{
ans=max(dp[i][0],dp[i][1]);
}
cout<<ans;
}