#include <bits/stdc++.h>
using namespace std;
const long double PI = 3.14159265359;
const long long MOD = (long long)998244353ll;
const long long MAXN = (long long)2e5 + 10;
const long long INF = (long long)2242545357980376863;
const long double EPS = (long double)1e-8;
long long su = 0;
long long a[MAXN], dp1[MAXN], dp2[MAXN], dp3[MAXN];
vector<long long> G[MAXN];
void DFS(long long u, long long p) {
  dp1[u] = 0;
  dp2[u] = 0;
  for (auto adj : G[u]) {
    if (adj == p) continue;
    DFS(adj, u);
    dp1[u] += dp1[adj];
    dp2[u] += dp2[adj];
  }
  dp2[u] += dp1[u];
  dp1[u] += a[u];
}
void DFS2(long long u, long long p, long long v) {
  dp3[u] = v;
  long long tot = 0;
  for (auto adj : G[u]) {
    if (adj == p) continue;
    DFS2(adj, u, (v + dp2[u] - (dp2[adj] + dp1[adj])) + (su - dp1[adj]));
  }
  return;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  long long n;
  cin >> n;
  for (int i = 1; i <= n; i++) cin >> a[i];
  for (int i = 1; i <= n; i++) su += a[i];
  long long u, v;
  for (int i = 1; i < n; i++) {
    cin >> u >> v;
    G[u].push_back(v);
    G[v].push_back(u);
  }
  DFS(1, -1);
  DFS2(1, -1, 0);
  long long ans = 0;
  for (int i = 1; i <= n; i++) ans = max(ans, dp2[i] + dp3[i]);
  cout << ans;
  return 0;
}
