#include<bits/stdc++.h>
using namespace std;
const int N = 3e5 + 9;
using ll = long long;
const ll inf = 1e18;
vector<pair<int, int>> g[N];
int par[N][20], dep[N], sz[N], st[N], en[N], T;
map<int, int> W[N];
void dfs_pre(int u, int pre = 0) {
par[u][0] = pre;
dep[u] = dep[pre] + 1;
sz[u] = 1;
st[u] = ++T;
for (int i = 1; i <= 18; i++) par[u][i] = par[par[u][i - 1]][i - 1];
for (auto [v, w] : g[u]) {
if (v == pre) continue;
dfs_pre(v, u);
sz[u] += sz[v];
}
en[u] = T;
}
int lca(int u, int v) {
if (dep[u] < dep[v]) swap(u, v);
for (int k = 18; k >= 0; k--) if (dep[par[u][k]] >= dep[v]) u = par[u][k];
if (u == v) return u;
for (int k = 18; k >= 0; k--) if (par[u][k] != par[v][k]) u = par[u][k], v = par[v][k];
return par[u][0];
}
int kth(int u, int k) {
for (int i = 0; i <= 18; i++) if (k & (1 << i)) u = par[u][i];
return u;
}
int dist(int u, int v) {
int lc = lca(u, v);
return dep[u] + dep[v] - 2 * dep[lc];
}
int isanc(int u, int v) {
return (st[u] <= st[v]) && (en[v] <= en[u]);
}
vector<pair<int, int>> t[N];
vector<int> buildtree(vector<int> v) {
sort(v.begin(), v.end(), [](int x, int y) {
return st[x] < st[y];
});
int s = v.size();
for (int i = 0; i < s - 1; i++) {
int lc = lca(v[i], v[i + 1]);
v.push_back(lc);
}
sort(v.begin(), v.end());
v.erase(unique(v.begin(), v.end()), v.end());
sort(v.begin(), v.end(), [](int x, int y) {
return st[x] < st[y];
});
stack<int> st;
st.push(v[0]);
for (int i = 1; i < v.size(); i++) {
while (!isanc(st.top(), v[i])) st.pop();
t[st.top()].push_back({v[i], 0});
st.push(v[i]);
}
return v;
}
ll dp[N][2];
int x, par_edge[N];
void dfs0(int u, int p = 0) {
for (auto [v, w]: t[u]) {
if (v ^ p) {
par_edge[v] = w;
dfs0(v, u);
}
}
}
void dfs(int u, int p = 0) {
ll tot = 0;
vector<ll> vec;
for (auto [v, w]: t[u]) {
if (v ^ p) {
dfs(v, u);
tot += dp[v][0];
vec.push_back(dp[v][1] - dp[v][0]);
}
}
sort(vec.begin(), vec.end());
for (int i = 1; i < vec.size(); i++) {
vec[i] += vec[i - 1];
}
int sz = vec.size(), add = p > 0;
if (x == 0 and p > 0) {
dp[u][0] = inf;
}
else {
int del = max(0, sz + add - x);
dp[u][0] = inf;
for (int i = del - 1; i < sz; i++) {
dp[u][0] = min(dp[u][0], tot + (i < 0 ? 0 : vec[i]));
}
}
if (p > 0) {
int del = max(0, sz - x);
dp[u][1] = inf;
for (int i = del - 1; i < sz; i++) {
dp[u][1] = min(dp[u][1], tot + (i < 0 ? 0 : vec[i]));
}
dp[u][1] += par_edge[u];
}
else {
dp[u][1] = inf;
}
}
int deg[N];
int32_t main() {
ios_base::sync_with_stdio(0);
cin.tie(0);
int n; cin >> n;
for (int i = 1; i < n; i++) {
int u, v, w; cin >> u >> v >> w;
g[u].push_back({v, w});
g[v].push_back({u, w});
deg[u]++;
deg[v]++;
W[u][v] = w;
W[v][u] = w;
}
dfs_pre(1);
vector<pair<int, int>> vec;
for (int i = 1; i <= n; i++) {
vec.push_back({deg[i], i});
}
sort(vec.rbegin(), vec.rend());
for (x = 0; x < n; x++) {
set<int> important;
for (auto [d, u]: vec) {
if (d < x) break;
important.insert(u);
// if (par[u][0]) {
// important.insert(par[u][0]);
// }
for (auto [v, w]: g[u]) {
important.insert(v);
}
}
if (important.empty()) {
cout << 0 << ' ';
continue;
}
vector<int> imp(important.begin(), important.end());
auto nodes = buildtree(imp);
for (auto u: nodes) {
for (auto &[v, w]: t[u]) {
if (W[u].find(v) != W[u].end()) {
w = W[u][v];
}
// cout << u << ' ' << v << ' ' << w << '\n';
}
}
int root = nodes.front();
dfs0(root);
dfs(root);
cout << dp[root][0] << ' ';
for (auto u: nodes) {
t[u].clear();
}
}
return 0;
}