#include <bits/stdc++.h>
using namespace std;
 
#define REP(i, n) for (ll i = 0; i < n; i++)
#define REPR(i, n) for (ll i = n; i >= 0; i--)
#define FOR(i, m, n) for (ll i = m; i < n; i++)
#define FORR(i, m, n) for (ll i = m; i >= n; i--)
#define REPO(i, n) for (ll i = 1; i <= n; i++)
#define ll long long
#define INF (ll)1 << 60
#define MINF (-1 * INF)
#define ALL(n) n.begin(), n.end()
#define MOD 1000000007
#define P pair<ll, ll>

ll n, dp0[110000], dp1[110000], dp2[110000], ndp2[110000], p[110000], ans = MINF;
vector<ll> g[110000];

void dfs(ll v, ll par){
    vector<ll> s0, s1, s2;
    REP(i, g[v].size()){
        ll w = g[v][i];
        if (w == par) continue;
        dfs(w, v);
        if(dp0[w] - 2 > 0) dp0[v] += dp0[w] - 2;
        s0.push_back(dp0[w] - 2);
        s1.push_back(dp1[w] - 1);
        s2.push_back(dp2[w] - 2);
    }
    //dp1
    REP(i, s0.size()){
        if (s0[i] >= 0) dp1[v] += s0[i];
    }
    ll dp1ma = 0;
    REP(i, s0.size()){
        if (s0[i] >= 0) dp1ma = max(dp1ma, s1[i] - s0[i]);
        else dp1ma = max(dp1ma, s1[i]);
    }
    dp1[v] += dp1ma;

    //dp2 * 1
    REP(i, s0.size()){
        if (s0[i] >= 0) ndp2[v] += s0[i];
    }
    ll dp2ma = 0;
    REP(i, s0.size()){
        if (s0[i] >= 0) dp2ma = max(dp2ma, s2[i] - s0[i]);
        else dp2ma = max(dp2ma, s2[i]);
    }
    ndp2[v] += dp2ma;

    //dp1 * 2
    vector<ll> d2;
    REP(i, s0.size()){
        if (s0[i] >= 0) dp2[v] += s0[i];
    }
    REP(i, s0.size()){
        if (s0[i] >= 0) d2.push_back(s1[i] - s0[i]);
        else d2.push_back(s1[i]);
    }
    sort(ALL(d2), greater<ll>());
    REP(i, min(2ll, (ll)d2.size())){
        if(d2[i] > 0) dp2[v] += d2[i];
    }
    dp2[v] = max(dp2[v], ndp2[v]);
    dp0[v] += p[v];
    dp1[v] += p[v];
    dp2[v] += p[v];
    ans = max({ans, dp0[v], dp1[v], dp2[v]});
}
int main(){
    cin >> n;
    REP(i, n)cin >> p[i];
    REP(i, n - 1){
        ll a, b;
        cin >> a >> b;
        a--;
        b--;
        g[a].push_back(b);
        g[b].push_back(a);
    }
    dfs(0, -1);
    cout << ans << endl;
}


