
import java.util.*;public class Test{ static int n; static final int maxn = 6005; static int cnt = 0; //edges[i][0] 相当于 edges[i].to //edges[i][1] 相当于 edges[i].next static int[][] edges = new int[maxn][2]; static int[] head = new int[maxn]; static boolean[] is_head = new boolean[maxn]; static boolean[] visited = new boolean[maxn]; static int[][] dp = new int[maxn][2]; static void dfs(int k){ visited[k] = true; for(int i = head[k]; i != -1; i = edges[i][1]){ if(visited[edges[i][0]]){ continue; } dfs(edges[i][0]); dp[k][1] += dp[edges[i][0]][0]; dp[k][0] += Math.max(dp[edges[i][0]][0], dp[edges[i][0]][1]); } } static void add_edge(int u, int v){ cnt++; edges[cnt][0] = v; edges[cnt][1] = head[u]; head[u] = cnt; } public static void main(String[] args) { Scanner sc = new Scanner(System.in); n = sc.nextInt(); for(int i = 1; i <= n; i++){ dp[i][1] = sc.nextInt(); } //初始化head[] Arrays.fill(head, -1); int k, l; for(int i = 0; i < n - 1; i++){ l = sc.nextInt(); k = sc.nextInt(); add_edge(k, l); is_head[l] = true; } for (int i = 1; i <= n; i++){ if(!is_head[i]){ dfs(i); System.out.println(Math.max(dp[i][0], dp[i][1])); return; } } }}