#include <bits/stdc++.h>
long long exp(long long x, long long y, long long p) {
  long long res = 1;
  while (y) {
    if (y % 2) res = (res * x % p) % p;
    x = (x * x) % p;
    y /= 2;
  }
  return res;
}
long long expo(long long x, long long y) {
  long long res = 1;
  while (y) {
    if (y % 2) res = (res * x % 998244353) % 998244353;
    x = (x * x) % 998244353;
    y /= 2;
  }
  return res;
}
long long add(long long a, long long b) {
  return (a % 998244353 + b % 998244353 + 998244353) % 998244353;
}
long long sub(long long a, long long b) {
  return (a % 998244353 - b % 998244353 + 998244353) % 998244353;
}
long long mul(long long a, long long b) {
  return ((a % 998244353) * (b % 998244353) + 998244353) % 998244353;
}
long long inv(long long x) { return expo(x, 998244353 - 2); }
long long fact[1000006] = {0};
void facto() {
  fact[0] = 1;
  fact[1] = 1;
  for (long long i = 2; i < 1000006; i++)
    fact[i] = (fact[i - 1] * i) % 998244353;
}
long long ncr(long long n, long long r) {
  long long res = 1;
  res = fact[n];
  res = (res * (expo(fact[r], 998244353 - 2))) % 998244353;
  res = (res * (expo(fact[n - r], 998244353 - 2))) % 998244353;
  return res;
}
long long npr(long long n, long long r) {
  long long res = 1;
  res = fact[n];
  res = (res * (expo(fact[n - r], 998244353 - 2))) % 998244353;
  return res;
}
long long takemod(long long x, long long n) {
  if (x < 0) {
    long long h = abs(x) / n;
    x += h * n;
  }
  if (x < 0) x += n;
  return (x % n);
}
using namespace std;
long long n, m;
long long a[300005], sum[300005], ans[300005], lvl[300005];
vector<long long> v[300005];
void dfs(long long node, long long par) {
  sum[node] = a[node];
  lvl[node] = lvl[par] + 1;
  for (auto h : v[node]) {
    if (h != par) {
      dfs(h, node);
      sum[node] += sum[h];
    }
  }
}
void dfsf(long long node, long long par) {
  if (par) {
    ans[node] = ans[par] + sum[1] - 2 * sum[node];
  }
  for (auto h : v[node]) {
    if (h != par) {
      dfsf(h, node);
    }
  }
}
void solve() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  {
    long long i, j, k;
    cin >> n;
    for (i = 1; i <= n; i++) cin >> a[i];
    for (i = 0; i < n - 1; i++) {
      long long x, y;
      cin >> x >> y;
      v[x].push_back(y);
      v[y].push_back(x);
    }
    lvl[0] = -1;
    dfs(1, 0);
    for (i = 1; i <= n; i++) ans[1] += (lvl[i] * a[i]);
    dfsf(1, 0);
    long long fin = 0;
    for (i = 0; i <= n; i++) fin = max(fin, ans[i]);
    cout << fin << "\n";
  }
}
signed main() {
  { solve(); }
  return 0;
}
