#include <bits/stdc++.h>
using namespace std;
struct t {
  long long r, s1, s2;
  t(void) { r = 0, s1 = 0, s2 = 0; }
  void up(long long x) {
    if (s1 < x) swap(s1, x);
    s2 = max(s2, x);
  }
  void mn(long long x) {
    if (s1 == x) {
      s1 = s2;
      s2 = 0;
    }
  }
};
long long n, cs[100005], ans;
vector<long long> g[100005];
map<long long, t> dp[100005];
t dfs(long long v, long long p, long long f) {
  if (dp[v].count(p)) return dp[v][p];
  t res;
  if (p == -1 || f) {
    for (long long u : g[v]) {
      if (u == p) continue;
      t x = dfs(u, v, f);
      x.r -= 2;
      x.s1--;
      if (x.r > 0) {
        res.r += x.r;
        res.up(-x.r + x.s1);
      } else
        res.up(x.s1);
    }
    res.r += cs[v];
    res.s1 += res.r;
    res.s2 += res.r;
  } else {
    res = dfs(v, -1, 0);
    t x = dfs(p, v, 0);
    x.r -= 2;
    x.s1--;
    if (x.r > 0) {
      res.r -= x.r;
      res.mn(res.r + x.s1);
      res.s1 -= x.r;
    } else
      res.mn(res.r + x.s1);
  }
  return dp[v][p] = res;
}
int main(void) {
  scanf("%lld", &n);
  long long ma = -100000000000000000;
  for (int i = 0; i < n; i++) {
    scanf("%lld", cs + i);
    ma = max(ma, cs[i]);
  }
  if (ma <= 0) {
    printf("%lld\n", ma);
    return 0;
  }
  for (int i = 0; i < n - 1; i++) {
    long long a, b;
    scanf("%lld%lld", &a, &b);
    g[--a].push_back(--b);
    g[b].push_back(a);
  }
  dfs(0, -1, 1);
  for (int i = 0; i < n; i++) ans = max(ans, dfs(i, -1, 0).s1);
  printf("%lld\n", ans);
}
