import sys import bisect sys.setrecursionlimit(10 ** 6) def solve(): it = iter(sys.stdin.buffer.read().split()) n = int(next(it)) w = [0] * (n + 1) for i in range(1, n + 1): w[i] = int(next(it)) g = [[] for _ in range(n + 1)] for _ in range(n - 1): u = int(next(it)) v = int(next(it)) g[u].append(v) g[v].append(u) sub = [0] * (n + 1) tin = [0] * (n + 1) tout = [0] * (n + 1) tmr = 0 stk = [(1, 0, 0)] par = [0] * (n + 1) while stk: v, p, state = stk.pop() if state == 0: par[v] = p tin[v] = tmr tmr += 1 stk.append((v, p, 1)) for u in reversed(g[v]): if u != p: stk.append((u, v, 0)) else: sub[v] = w[v] for u in g[v]: if u != p: sub[v] += sub[u] tout[v] = tmr - 1 total = sub[1] ans = 10 ** 30 a = [(sub[i], i) for i in range(2, n + 1)] a.sort() vs = [x[0] for x in a] def inside(u, v): return tin[v] <= tin[u] <= tout[v] for v in range(2, n + 1): s = sub[v] rest = total - s tgt = s // 2 idx = bisect.bisect_left(vs, tgt) for j in range(max(0, idx - 2), min(len(vs), idx + 3)): y = vs[j] u = a[j][1] if u == v: continue if not inside(u, v): continue b = [y, s - y, rest] b.sort() cur = b[2] - b[0] if cur < ans: ans = cur tgt = rest // 2 idx = bisect.bisect_left(vs, tgt) for j in range(max(0, idx - 2), min(len(vs), idx + 3)): y = vs[j] u = a[j][1] if inside(u, v): continue b = [s, y, rest - y] b.sort() cur = b[2] - b[0] if cur < ans: ans = cur print(ans) if __name__ == '__main__': solve()