#include <bits/stdc++.h>
using namespace std;

long long sum[500000 + 5];
long long b[500000 + 5];

void DFS(long long node, vector<long long> G[], long long used[], long long parent[]) {
    used[node] = 1;

    for (long long neighbour : G[node]) {
        if (used[neighbour] == 0) {
            parent[neighbour] = node;
            DFS(neighbour, G, used, parent);
        }
    }

    long long best = 0;

    for (long long child : G[node]) {
        if (child != parent[node]) {
            best = max(best, sum[child]);
        }
    }

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

int main() {
    long long n;
    cin >> n;

    vector<long long> G[n + 1];

    for (long long i = 1; i <= n; i++) {
        cin >> b[i];
    }

    for (long long i = 1; i <= n - 1; i++) {
        long long u, v;
        cin >> u >> v;

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

    long long used[n + 1] = {};
    long long parent[n + 1] = {};

    DFS(1, G, used, parent);

    long long answer = -1000000000000000LL;

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

    cout << answer;

    return 0;
}