import java.util.*;

public class Main {
    static long[] sum;
    static int[] b;

    public static void DFS(int node, int parent, List<Integer>[] G) {

        long bestChild = 0;

        for (int child : G[node]) {

            if (child == parent) {
                continue;
            }

            DFS(child, node, G);

            bestChild = Math.max(bestChild, sum[child]);
        }

        sum[node] = b[node] + bestChild;
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        int n = scanner.nextInt();

        b = new int[n + 1];
        sum = new long[n + 1];

        for (int i = 1; i <= n; i++) {
            b[i] = scanner.nextInt();
        }

        List<Integer>[] G = new List[n + 1];

        for (int i = 0; i <= n; i++) {
            G[i] = new ArrayList<>();
        }

        for (int i = 1; i <= n - 1; i++) {
            int u = scanner.nextInt();
            int v = scanner.nextInt();

            G[u].add(v);
            G[v].add(u);
        }

        DFS(1, 0, G);

        long answer = Long.MIN_VALUE;

        for (int i = 1; i <= n; i++) {
            answer = Math.max(answer, sum[i]);
        }

        System.out.println(answer);
    }
}