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

const long long MaxN = 1e5 + 5;

long long n,ans, a[MaxN], dp[MaxN];
vector<long long> vt[MaxN];

void dfs(long long u, long long par)
{
    dp[u]=a[u];

    long long mx1=LLONG_MIN;
    long long mx2=LLONG_MIN;

    for (long long v : vt[u])
    {
        if(v==par) continue;

        dfs(v,u);

        if(dp[v]>mx1)
        {
            mx2=mx1;
            mx1=dp[v];
        }
        else if(dp[v]>mx2)
        {
            mx2=dp[v];
        }
    }

    dp[u]+=max(0LL,mx1);

    long long cur=a[u]+max(0LL,mx1)+max(0LL,mx2);

    ans=max(ans,cur);
}

void input()
{
    cin >> n;

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

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

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

void solve()
{
    ans=LLONG_MIN;

    dfs(1,-1);

    cout << ans << "\n";
}

int main()
{
    ios_base::sync_with_stdio(0);
    cin.tie(0);

    input();
    solve();
}