#include #include #include #include #include using namespace std; using ll = long long; #define rep(i, n) for (ll i = 0; i < (ll)(n); i++) #define all(v) begin(v), end(v) template bool chmin(T &dst, T src) { if (dst > src) { dst = src; return true; } return false; } int main() { cin.tie(nullptr); ios::sync_with_stdio(false); int n; cin >> n; vector w(n); rep(i, n) cin >> w[i]; vector> graph(n); vector> edges(n - 1); rep(i, n - 1) { int a, b; cin >> a >> b; a--; b--; graph[a].emplace_back(b); graph[b].emplace_back(a); edges[i] = {a, b}; } ll ans = 1LL << 60; rep(i, n - 1) { for (int j = i + 1; j < n - 1; ++j) { set remain; rep(k, n) remain.insert(k); auto dfs = [&](auto &&f, int v, int p) -> ll { remain.erase(v); ll sum = w[v]; for (auto &c : graph[v]) { if (c == p) continue; if (edges[i] == pair{v, c} || edges[i] == pair{c, v}) continue; if (edges[j] == pair{v, c} || edges[j] == pair{c, v}) continue; sum += f(f, c, v); } return sum; }; vector result; while (!remain.empty()) { result.push_back(dfs(dfs, *remain.begin(), -1)); } assert(result.size() == 3); sort(all(result)); chmin(ans, result.back() - result.front()); } } cout << ans << endl; }