#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 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}); } } } const ll INF = (1LL << 62); vector ans(N, -INF); for (int r = 0; r < N; ++r) { for (int s = 0; s < N; ++s) { for (int t = 0; t < N; ++t) { if (dist[s][r] + dist[r][t] != dist[s][t]) continue; ll d = dist[s][t]; ll score = sum[s][t] - d * (d + 1) / 2; ans[r] = max(ans[r], score); } } } cout << *min_element(ans.begin(), ans.end()) << '\n'; }