#include <bits/stdc++.h>
using namespace std;
const int maxn = 200000 + 10;
const int apsz = 26;
long long dp[maxn];
long long sz[maxn];
long long g[maxn];
long long a[maxn];
vector<int> G[maxn];
long long ans;
int n;
void dfs(int u, int fa) {
  sz[u]++;
  g[u] += a[u];
  for (auto v : G[u]) {
    if (v == fa) continue;
    dfs(v, u);
    g[u] += g[v];
    sz[u] += sz[v];
    dp[u] += dp[v] + g[v];
  }
}
void Dp(int u, int fa) {
  ans = max(ans, dp[u]);
  for (auto v : G[u]) {
    if (v == fa) continue;
    long long sz1, g1, dp1, sz2, g2, dp2;
    sz1 = sz[u], g1 = g[u], dp1 = dp[u];
    sz2 = sz[v], g2 = g[v], dp2 = dp[v];
    sz[u] -= sz[v], g[u] -= g[v], dp[u] -= dp[v] + g[v];
    sz[v] += sz[u], g[v] += g[u], dp[v] += dp[u] + g[u];
    Dp(v, u);
    sz[u] = sz1, g[u] = g1, dp[u] = dp1;
    sz[v] = sz2, g[v] = g2, dp[v] = dp2;
  }
}
int main(void) {
  scanf("%d", &(n));
  for (int i = (0); i < (n); ++i) scanf("%lld", &(a[i]));
  for (int i = (1); i < (n); ++i) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--, v--;
    G[u].push_back(v), G[v].push_back(u);
  }
  dfs(0, -1);
  Dp(0, -1);
  printf("%lld\n", ans);
  return 0;
}
