#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 ",max(dp[root][0],dp[root][1])); } }