#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N = 1e5 + 3, mod = 998244353, inf = 2e9;
ll dp[N][2];
void dfs(int u, int p, int &curK, vector<vector<pair<int, int>>> &g, vector <int> &w) {
dp[u][0] = 0;
dp[u][1] = 0;
vector <int> luu;
for (pair <int, int> P : g[u]) {
int v = P.first;
if (v == p) continue;
dfs(v, u, curK, g, w);
luu.push_back(dp[v][1] + w[P.second] - dp[v][0]);
dp[u][1] += dp[v][0];
dp[u][0] += dp[v][0];
}
sort(luu.begin(), luu.end(), greater <int> ());
for (int i = 0; i < min((int)luu.size(), curK); ++i) {
if (luu[i] < 0) break;
dp[u][0] += luu[i];
if (i != curK - 1) dp[u][1] += luu[i];
}
}
vector <ll> minimum_closure_costs(int n, vector <int> u, vector <int> v, vector <int> w) {
vector <ll> ans(n, 0);
vector <vector<pair<int, int>>> g(n);
ll sum = 0;
int maxdeg = 0;
bool sub1 = 1;
for (int i = 0; i < n - 1; ++i) {
g[u[i]].emplace_back(v[i], i);
g[v[i]].emplace_back(u[i], i);
sum += w[i];
maxdeg = max({maxdeg, (int)g[u[i]].size(), (int)g[v[i]].size()});
if (u[i] != 0) sub1 = 0;
}
if (sub1) {
sort(w.begin(), w.end(), greater <int> ());
for (int i = n - 2; i >= 0; --i) ans[i] = ans[i + 1] + w[i];
return ans;
}
for (int k = 0; k < maxdeg; ++k) {
dfs(0, 0, k, g, w);
ans[k] = dp[0][0];
}
for (int i = 0; i < maxdeg; ++i) ans[i] = sum - ans[i];
return ans;
}