#include using namespace std; using ll = long long; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int N; cin >> N; vector A(N); for (auto &x : A) cin >> x; vector> G(N); for (int i = 0; i < N - 1; ++i) { int u, v; cin >> u >> v; --u, --v; G[u].push_back(v); G[v].push_back(u); } vector par(N, -1), sz(N), order = {0}; for (int i = 0; i < N; ++i) { int v = order[i]; for (int u : G[v]) { if (u == par[v]) continue; par[u] = v; order.push_back(u); } } for (int i = N - 1; i >= 0; --i) { int v = order[i]; sz[v] = 1; for (int u : G[v]) if (par[u] == v) sz[v] += sz[u]; } int c = 0; for (int v = 0; v < N; ++v) { int mx = N - sz[v]; for (int u : G[v]) if (par[u] == v) mx = max(mx, sz[u]); if (mx * 2 <= N) { c = v; break; } } vector> dist(N, vector(N)); vector> sum(N, vector(N)); for (int s = 0; s < N; ++s) { vector> st = {{s, -1}}; sum[s][s] = A[s]; while (!st.empty()) { auto [v, p] = st.back(); st.pop_back(); for (int u : G[v]) { if (u == p) continue; dist[s][u] = dist[s][v] + 1; sum[s][u] = sum[s][v] + A[u]; st.push_back({u, v}); } } } ll ans = A[c]; for (int s = 0; s < N; ++s) { for (int t = 0; t < N; ++t) { if (dist[s][c] + dist[c][t] != dist[s][t]) continue; ll d = dist[s][t]; ans = max(ans, sum[s][t] - d * (d + 1) / 2); } } cout << ans << '\n'; }