#include<iostream>
#include<algorithm>
#include<cstring>
using namespace std;
const int N = 1e6 + 10,M=2*N;
//mx1 以i节点为根的子树中,i节点到叶子节点的最长距离(不包含i节点)既最长链
//mx2 以i节点为根的子树中,i节点到叶子节点的次长距离(不包含i节点)既次长链
int h[N], ne[M], idx, e[M], n,a[N],mx1,mx2,f[N],ans;
void add(int a, int b)
{
e[idx] = b, ne[idx] = h[a], h[a] = idx++;
}
void dfs(int u, int fa)
{
int mx1 = 0, mx2 = 0;
for (int i = h[u]; i != -1; i = ne[i])
{
int j = e[i];
if (j == fa) continue;
dfs(j, u);
if (f[j] > mx1) mx2 = mx1, mx1 = f[j];
else if (f[j] > mx2) mx2 = f[j];
}
ans = max(ans, mx1 + mx2 + a[u]);
f[u] = mx1 + a[u];
}
int main()
{
ios::sync_with_stdio(false);
memset(h, -1, sizeof h);
cin >> n;
for (int i = 1; i <= n; i++) cin >> a[i];
for (int i = 1; i < n; i++)
{
int u, v;
cin >> u >> v;
add(u, v), add(v, u);
}
dfs(1, 0);
cout << ans << endl;
return 0;
}