#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 200025;
long long sum[MAX_N], val[MAX_N], ans[MAX_N], ans_, Sum;
int p[MAX_N], eid, cnt[MAX_N];
bool vis[MAX_N];
void init() {
  memset(vis, false, sizeof(vis));
  memset(p, -1, sizeof(p));
  eid = 0;
}
struct edge {
  int v, next;
} e[MAX_N << 1];
void add(int u, int v) {
  e[eid].v = v;
  e[eid].next = p[u];
  p[u] = eid++;
}
void dfs1(int u, int v) {
  for (int i = p[v]; i + 1; i = e[i].next) {
    int y = e[i].v;
    if (y == u) continue;
    dfs1(v, y);
    sum[v] += sum[y];
    val[v] += val[y];
  }
  sum[v] += cnt[v];
  val[u] += sum[v];
}
void dfs2(int u, int v) {
  if (u == 0)
    ans[v] = val[v], ans_ = max(ans_, ans[v]);
  else
    ans[v] = ans[u] - 2 * sum[v] + Sum, ans_ = max(ans[v], ans_);
  for (int i = p[v]; i + 1; i = e[i].next) {
    int y = e[i].v;
    if (y == u) continue;
    dfs2(v, y);
  }
}
int main() {
  int n, a, b;
  Sum = 0;
  init();
  scanf("%d", &n);
  for (int i = 1; i <= n; ++i) scanf("%d", &cnt[i]), Sum += cnt[i];
  for (int i = 1; i < n; ++i) {
    scanf("%d%d", &a, &b);
    add(a, b), add(b, a);
  }
  dfs1(0, 1);
  memset(vis, false, sizeof(vis));
  dfs2(0, 1);
  printf("%lld\n", ans_);
  return 0;
}
