#include <bits/stdc++.h>
const int N = 100010;
struct Edge {
  int nex, v;
} edge[N << 1];
int top;
long long f[N][4];
int e[N], val[N];
inline void add(int x, int y) {
  top++;
  edge[top].v = y;
  edge[top].nex = e[x];
  e[x] = top;
  return;
}
inline void update(int x, int y, int z, int i) {
  if (x != z && y != z) {
    f[i][1] = std::max(f[i][1], f[x][2] + f[y][2] + f[z][0] + val[i]);
  }
  return;
}
void DFS(int x, int fa) {
  int a = 0, b = 0, c = 0;
  int a0 = 0, b0 = 0, c0 = 0;
  int a3 = 0, b3 = 0;
  for (int i = e[x]; i; i = edge[i].nex) {
    int y = edge[i].v;
    if (y == fa) {
      continue;
    }
    DFS(y, x);
    f[x][2] = std::max(f[x][2], f[y][2]);
    if (f[y][2] > f[a][2]) {
      c = b;
      b = a;
      a = y;
    } else if (f[y][2] > f[b][2]) {
      c = b;
      b = y;
    } else if (f[y][2] > f[c][2]) {
      c = y;
    }
    f[x][0] = std::max(f[x][0], f[y][0]);
    f[x][3] = std::max(f[x][3], f[y][3] + val[x]);
    if (f[y][0] > f[a0][0]) {
      c0 = b0;
      b0 = a0;
      a0 = y;
    } else if (f[y][0] > f[b0][0]) {
      c0 = b0;
      b0 = y;
    } else if (f[y][0] > f[c0][0]) {
      c0 = y;
    }
    f[x][1] = std::max(f[x][1], f[y][1]);
    if (f[y][3] > f[a3][3]) {
      b3 = a3;
      a3 = y;
    } else if (f[y][3] > f[b3][3]) {
      b3 = y;
    }
  }
  f[x][2] += val[x];
  f[x][0] = std::max(f[x][0], f[a][2] + f[b][2] + val[x]);
  if (a != a0) {
    f[x][3] = std::max(f[x][3], f[a][2] + f[a0][0] + val[x]);
  } else {
    f[x][3] = std::max(f[x][3], f[a][2] + f[b0][0] + val[x]);
    f[x][3] = std::max(f[x][3], f[b][2] + f[a0][0] + val[x]);
  }
  f[x][1] = std::max(f[x][1], f[a0][0] + f[b0][0]);
  update(a, b, a0, x);
  update(a, b, b0, x);
  update(a, b, c0, x);
  update(b, c, a0, x);
  update(b, c, b0, x);
  update(b, c, c0, x);
  update(a, c, a0, x);
  update(a, c, b0, x);
  update(a, c, c0, x);
  if (a != a3) {
    f[x][1] = std::max(f[x][1], f[a][2] + f[a3][3] + val[x]);
  } else {
    f[x][1] = std::max(f[x][1], f[a][2] + f[b3][3] + val[x]);
    f[x][1] = std::max(f[x][1], f[b][2] + f[a3][3] + val[x]);
  }
  return;
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &val[i]);
  }
  for (int i = 1, x, y; i < n; i++) {
    scanf("%d%d", &x, &y);
    add(x, y);
    add(y, x);
  }
  DFS(1, 0);
  printf("%lld", f[1][1]);
  return 0;
}
