#include<iostream>#include<cstdio>#include<cstring>usingnamespace std;constint N =6005;int dp[N][2];//动态规划数组int to[N], h[N], ne[N], idx;//前向星int n, L, K;int indegree[N],happy[N];//入度、happy值inlineintbigger(int&a,int&b){return a > b ? a : b;}inlinevoidaddEdge(int be,int en){
to[idx]= en;
ne[idx]= h[be];
h[be]= idx++;}voiddfs_dp(int x){//树形DP
dp[x][1]= happy[x];for(int i = h[x]; i !=-1; i = ne[i]){int y = to[i];dfs_dp(y);
dp[x][1]+= dp[y][0];
dp[x][0]+=bigger(dp[y][1], dp[y][0]);}}intmain(){while(scanf("%d",&n)!=EOF){memset(indegree,0,sizeof(indegree));memset(h,-1,sizeof(h));for(int i =1; i <= n;++i)scanf("%d",&happy[i]);int a, b;for(int i =0; i < n -1;++i){scanf("%d%d",&a,&b);addEdge(b, a);
indegree[a]++;}scanf("%d%d",&a,&b);int root;//根结点for(int i =1; i <= n;++i){if(indegree[i]==0){
root = i;break;}}dfs_dp(root);printf("%d\n",bigger(dp[root][0], dp[root][1]));}}