数的dp;
#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
#define ll long long
int n;
int father[6005],dp[6005][2];
int vis[6005];
int max(int x,int y)
{
if(x>y) return x;
else return y;
}
void tree_dp(int node)
{
vis[node] = 1;
for(int i=1; i<=n; i++)
{
if(!vis[i]&&father[i]==node)
{
tree_dp(i);
dp[node][1] += dp[i][0];
dp[node][0] += max(dp[i][0], dp[i][1]);
}
}
}
int main()
{
int b,a,root;
while(~scanf("%d",&n))
{
memset(father,0,sizeof(father));
memset(dp,0,sizeof(dp));
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++)
scanf("%d",&dp[i][1]);
root=0;
while(scanf("%d %d",&a,&b)&&(a+b))
{father[a]=b;root=b;} //输入父节点,于子节点;
while(father[root]) //查找父结点,最原始的根;
root = father[root];
tree_dp(root);
printf("%d\n",max(dp[root][0], dp[root][1]));
}
return 0;
}