#include <bits/stdc++.h>
using namespace std;
const int MAX = 100005;
const int MOD = 1000000007;
int a[MAX];
vector<int> g[MAX];
map<pair<int, int>, long long> dp;
map<pair<int, int>, long long> dp2;
void fun(int n, int p) {
  pair<int, int> cur = {n, p};
  if (dp.find(cur) != dp.end()) {
    return;
  }
  dp[cur] = a[n];
  vector<long long> maxes;
  for (int i : g[n]) {
    if (i == p) {
      continue;
    }
    fun(i, n);
    dp[cur] = max(dp[cur], dp[{i, n}] + a[n]);
    maxes.push_back(dp[{i, n}]);
    dp2[cur] = max(dp2[cur], dp2[{i, n}]);
  }
  sort(maxes.begin(), maxes.end());
  reverse(maxes.begin(), maxes.end());
  long long tot = a[n];
  if (maxes.size() >= 2) {
    tot += maxes[0] + maxes[1];
  } else if (!maxes.empty()) {
    tot += maxes[0];
  }
  dp2[cur] = max(dp2[cur], tot);
}
vector<pair<int, int> > e;
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 0; i < n; i++) {
    scanf("%d", &a[i + 1]);
  }
  for (int i = 0; i < n - 1; i++) {
    int u, v;
    scanf("%d %d", &u, &v);
    g[u].push_back(v);
    g[v].push_back(u);
    e.push_back({u, v});
  }
  long long maxi = -1;
  for (auto i : e) {
    fun(i.first, i.second);
    fun(i.second, i.first);
  }
  for (auto i : e) {
    maxi = max(maxi, dp2[{i.first, i.second}] + dp2[{i.second, i.first}]);
  }
  printf("%lld", maxi);
}
