#include using namespace std; using ll = long long; using vi = vector < int >; using pii = pair < int, int >; #define pb push_back #define sz(x) ((int)(x).size()) #define all(a) (a).begin(), (a).end() #define qio() cin.tie(0) -> sync_with_stdio(0) #define L(i, j, k) for (int i = j; i <= int(k); i++) #define R(i, j, k) for (int i = j; i >= int(k); i--) const int N = 1003; int n, tot, sz[N], rt[N], ls[N], rs[N]; ll ans, a[N], val[N], End[N]; vi G[N]; int merge(int x, int y) { if (!x | !y) return x | y; if (val[x] < val[y]) swap(x, y); rs[x] = merge(rs[x], y); return swap(ls[x], rs[x]), x; } ll pop(int x) { ll ret = val[rt[x]]; return sz[x]--, rt[x] = merge(ls[rt[x]], rs[rt[x]]), ret; } void dfs(int u, int f) { for (int v : G[u]) if (v != f) { dfs(v, u); End[u] += End[v]; sz[u] += sz[v]; rt[u] = merge(rt[u], rt[v]); } for (; sz[u] >= 0; a[u] -= pop(u), a[u] += pop(u)) { if (sz[u] == 0 || a[u] >= val[rt[u]]) { val[++tot] = a[u]; sz[u]++; rt[u] = merge(rt[u], tot); return; } else if (sz[u] == 1) { End[u] += a[u] - pop(u); return; } } } int main() { qio(), cin >> n; L(i, 1, n) cin >> a[i]; L(i, 1, n - 1) { int u, v; cin >> u >> v; G[u].pb(v); G[v].pb(u); } dfs(1, 0); int sgn = 1; for (; sz[1]; sgn *= -1) ans += pop(1) * sgn; ans += sgn * End[1]; cout << ans << '\n'; return 0; }