#include<iostream>
#include<cstring>
#include<cstdio>
#include<vector>
using namespace std;
int n,dp[6050][2],flag[6050],h[6050];
vector<int> son[6050];
void dfs(int u){
dp[u][0]=0;
dp[u][1]=h[u];
for(int i=0;i<son[u].size();i++){
int v=son[u][i];
dfs(v);
dp[u][0]+=max(dp[v][0],dp[v][1]);
dp[u][1]+=dp[v][0];
}
}
int main(){
while(scanf("%d",&n),n){
memset(h,0,sizeof h);
memset(flag,0,sizeof flag);
memset(dp,0,sizeof dp);
for(int i=1;i<=n;i++)scanf("%d",&h[i]);
for(int i=1;i<n;i++){
int u,v;
scanf("%d%d",&v,&u);
son[u].push_back(v);
flag[v]=1;
}
int root;
for(int i=1;i<=n;i++)
if(!flag[i]){root=i;break;}
dfs(root);
printf("%d\n",max(dp[root][0],dp[root][1]));
}
}