#include #include using std::cin; using std::cout; const char endl = '\n'; const int N = 1e5 + 5; int n, sum, root, c[N], siz[N], max_siz[N], dep[N]; long long ans; std::vector> g[N]; void dfs1(int u, int f) { siz[u] = c[u]; for (auto e : g[u]) { int v = e.first, w = e.second; if (v == f) continue; dfs1(v, u); siz[u] += siz[v]; max_siz[u] = std::max(max_siz[u], siz[v]); } max_siz[u] = std::max(max_siz[u], sum - siz[u]); } void dfs2(int u, int f) { for (auto e : g[u]) { int v = e.first, w = e.second; if (v == f) continue; dep[v] = dep[u] + w; dfs2(v, u); } } int main() { std::ios::sync_with_stdio(false); cin.tie(nullptr); cin >> n; for (int i = 1; i <= n; i++) { cin >> c[i]; sum += c[i]; } for (int i = 1, u, v, w; i <= n; i++) { cin >> u >> v >> w; g[u].emplace_back(v, w); g[v].emplace_back(u, w); } dfs1(1, 0); for (int i = 1; i <= n; i++) { if (!root || max_siz[i] < max_siz[root]) { root = i; } } dep[0] = -1; dfs2(root, 0); for (int i = 1; i <= n; i++) { ans += static_cast(c[i]) * dep[i]; } cout << ans << endl; return 0; }