#include <bits/stdc++.h>
#define ll long long
#define el cout << '\n'
#define ii pair<ll, ll>
#define fi first
#define se second
using namespace std;
struct Item
{
int top;
ll min_dist, dist;
Item(int top = 0, ll min_dist = 0, ll dist = 0) :
top(top), min_dist(min_dist), dist(dist) {};
bool operator < (Item other) const
{
return min_dist < other.min_dist;
}
};
const int maxn = 1e5;
const int MOD = 998244353;
const ll INF = 1e18;
int n, sz[maxn + 10];
ll ans[maxn + 10];
bool del[maxn + 10];
vector<ii> adj[maxn + 10];
vector<Item> c_global, c_internal;
void build_sz(int top, int p = -1)
{
sz[top] = 1;
for (ii pr : adj[top])
{
int next_top = pr.fi;
if (next_top == p || del[next_top])
continue;
build_sz(next_top, top);
sz[top] += sz[next_top];
}
}
int find_centroid(int top, int p, int tree_sz)
{
for (ii pr : adj[top])
{
int next_top = pr.fi;
if (next_top == p || del[next_top])
continue;
if (2 * sz[next_top] > tree_sz)
return find_centroid(next_top, top, tree_sz);
}
return top;
}
void travelsel(int top, int p, ll min_dist, int dist)
{
c_global.push_back(Item(top, min_dist, dist));
c_internal.push_back(Item(top, min_dist, dist));
for (ii pr : adj[top])
{
int next_top = pr.fi;
ll w = pr.se;
if (next_top == p || del[next_top])
continue;
travelsel(next_top, top, min(min_dist, w), dist + 1);
}
}
void calc(vector<Item> &it, int sign)
{
sort(it.begin(), it.end());
ll sum_dist = 0;
ll sum_square_dist = 0;
ll sum_min_dist = 0;
for (int i = it.size() - 1; i + 1; i--)
{
int top = it[i].top;
ll min_dist = it[i].min_dist;
ll dist = it[i].dist;
int cnt = it.size() - i - 1;
(ans[top] += sign * min_dist * (dist * dist % MOD * cnt + 2 * dist * sum_dist % MOD + sum_square_dist)) %= MOD;
(sum_dist += dist) %= MOD;
(sum_square_dist += dist * dist % MOD) %= MOD;
}
sum_dist = 0;
sum_square_dist = 0;
for (int i = 0; i < it.size(); i++)
{
int top = it[i].top;
ll min_dist = it[i].min_dist;
ll dist = it[i].dist;
(ans[top] += sign * (dist * dist % MOD * sum_min_dist % MOD + 2 * dist * sum_dist % MOD + sum_square_dist)) %= MOD;
(sum_dist += min_dist * dist % MOD) %= MOD;
(sum_square_dist += min_dist * dist % MOD * dist % MOD) %= MOD;
(sum_min_dist += min_dist) %= MOD;
}
}
void centroid_decomposition(int top)
{
build_sz(top);
int centroid = find_centroid(top, -1, sz[top]);
del[centroid] = 1;
c_global.push_back(Item(centroid, INF, 0));
for (ii pr : adj[centroid])
{
int next_top = pr.fi;
ll w = pr.se;
if (del[next_top])
continue;
travelsel(next_top, centroid, w, 1);
calc(c_internal, -1);
c_internal.clear();
}
calc(c_global, 1);
c_global.clear();
for (ii pr : adj[centroid])
{
int next_top = pr.fi;
if (del[next_top])
continue;
centroid_decomposition(next_top);
}
}
int main()
{
ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
if (fopen("NETW.INP", "r"))
{
freopen("NETW.INP", "r", stdin);
freopen("NETW.OUT", "w", stdout);
}
cin >> n;
for (int i = 1; i < n; i++)
{
int x, y;
ll w;
cin >> x >> y >> w;
adj[x].push_back({y, w});
adj[y].push_back({x, w});
}
centroid_decomposition(1);
for (int i = 1; i <= n; i++)
cout << (ans[i] + MOD) % MOD, el;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CgojZGVmaW5lIGxsIGxvbmcgbG9uZwojZGVmaW5lIGVsIGNvdXQgPDwgJ1xuJwojZGVmaW5lIGlpIHBhaXI8bGwsIGxsPgojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgc2Ugc2Vjb25kCgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IEl0ZW0KewogICAgaW50IHRvcDsKICAgIGxsIG1pbl9kaXN0LCBkaXN0OwoKICAgIEl0ZW0oaW50IHRvcCA9IDAsIGxsIG1pbl9kaXN0ID0gMCwgbGwgZGlzdCA9IDApIDoKICAgICAgICB0b3AodG9wKSwgbWluX2Rpc3QobWluX2Rpc3QpLCBkaXN0KGRpc3QpIHt9OwogICAgYm9vbCBvcGVyYXRvciA8IChJdGVtIG90aGVyKSBjb25zdAogICAgewogICAgICAgIHJldHVybiBtaW5fZGlzdCA8IG90aGVyLm1pbl9kaXN0OwogICAgfQp9OwoKY29uc3QgaW50IG1heG4gPSAxZTU7CmNvbnN0IGludCBNT0QgPSA5OTgyNDQzNTM7CmNvbnN0IGxsIElORiA9IDFlMTg7CgppbnQgbiwgc3pbbWF4biArIDEwXTsKbGwgYW5zW21heG4gKyAxMF07CmJvb2wgZGVsW21heG4gKyAxMF07CnZlY3RvcjxpaT4gYWRqW21heG4gKyAxMF07CnZlY3RvcjxJdGVtPiBjX2dsb2JhbCwgY19pbnRlcm5hbDsKCnZvaWQgYnVpbGRfc3ooaW50IHRvcCwgaW50IHAgPSAtMSkKewogICAgc3pbdG9wXSA9IDE7CiAgICBmb3IgKGlpIHByIDogYWRqW3RvcF0pCiAgICB7CiAgICAgICAgaW50IG5leHRfdG9wID0gcHIuZmk7CiAgICAgICAgaWYgKG5leHRfdG9wID09IHAgfHwgZGVsW25leHRfdG9wXSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgYnVpbGRfc3oobmV4dF90b3AsIHRvcCk7CiAgICAgICAgc3pbdG9wXSArPSBzeltuZXh0X3RvcF07CiAgICB9Cn0KaW50IGZpbmRfY2VudHJvaWQoaW50IHRvcCwgaW50IHAsIGludCB0cmVlX3N6KQp7CiAgICBmb3IgKGlpIHByIDogYWRqW3RvcF0pCiAgICB7CiAgICAgICAgaW50IG5leHRfdG9wID0gcHIuZmk7CiAgICAgICAgaWYgKG5leHRfdG9wID09IHAgfHwgZGVsW25leHRfdG9wXSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgaWYgKDIgKiBzeltuZXh0X3RvcF0gPiB0cmVlX3N6KQogICAgICAgICAgICByZXR1cm4gZmluZF9jZW50cm9pZChuZXh0X3RvcCwgdG9wLCB0cmVlX3N6KTsKICAgIH0KICAgIHJldHVybiB0b3A7Cn0Kdm9pZCB0cmF2ZWxzZWwoaW50IHRvcCwgaW50IHAsIGxsIG1pbl9kaXN0LCBpbnQgZGlzdCkKewogICAgY19nbG9iYWwucHVzaF9iYWNrKEl0ZW0odG9wLCBtaW5fZGlzdCwgZGlzdCkpOwogICAgY19pbnRlcm5hbC5wdXNoX2JhY2soSXRlbSh0b3AsIG1pbl9kaXN0LCBkaXN0KSk7CgogICAgZm9yIChpaSBwciA6IGFkalt0b3BdKQogICAgewogICAgICAgIGludCBuZXh0X3RvcCA9IHByLmZpOwogICAgICAgIGxsIHcgPSBwci5zZTsKICAgICAgICBpZiAobmV4dF90b3AgPT0gcCB8fCBkZWxbbmV4dF90b3BdKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICB0cmF2ZWxzZWwobmV4dF90b3AsIHRvcCwgbWluKG1pbl9kaXN0LCB3KSwgZGlzdCArIDEpOwogICAgfQp9CnZvaWQgY2FsYyh2ZWN0b3I8SXRlbT4gJml0LCBpbnQgc2lnbikKewogICAgc29ydChpdC5iZWdpbigpLCBpdC5lbmQoKSk7CiAgICBsbCBzdW1fZGlzdCA9IDA7CiAgICBsbCBzdW1fc3F1YXJlX2Rpc3QgPSAwOwogICAgbGwgc3VtX21pbl9kaXN0ID0gMDsKICAgIGZvciAoaW50IGkgPSBpdC5zaXplKCkgLSAxOyBpICsgMTsgaS0tKQogICAgewogICAgICAgIGludCB0b3AgPSBpdFtpXS50b3A7CiAgICAgICAgbGwgbWluX2Rpc3QgPSBpdFtpXS5taW5fZGlzdDsKICAgICAgICBsbCBkaXN0ID0gaXRbaV0uZGlzdDsKICAgICAgICBpbnQgY250ID0gaXQuc2l6ZSgpIC0gaSAtIDE7CiAgICAgICAgKGFuc1t0b3BdICs9IHNpZ24gKiBtaW5fZGlzdCAqIChkaXN0ICogZGlzdCAlIE1PRCAqIGNudCArIDIgKiBkaXN0ICogc3VtX2Rpc3QgJSBNT0QgKyBzdW1fc3F1YXJlX2Rpc3QpKSAlPSBNT0Q7CiAgICAgICAgKHN1bV9kaXN0ICs9IGRpc3QpICU9IE1PRDsKICAgICAgICAoc3VtX3NxdWFyZV9kaXN0ICs9IGRpc3QgKiBkaXN0ICUgTU9EKSAlPSBNT0Q7CiAgICB9CiAgICBzdW1fZGlzdCA9IDA7CiAgICBzdW1fc3F1YXJlX2Rpc3QgPSAwOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBpdC5zaXplKCk7IGkrKykKICAgIHsKICAgICAgICBpbnQgdG9wID0gaXRbaV0udG9wOwogICAgICAgIGxsIG1pbl9kaXN0ID0gaXRbaV0ubWluX2Rpc3Q7CiAgICAgICAgbGwgZGlzdCA9IGl0W2ldLmRpc3Q7CiAgICAgICAgKGFuc1t0b3BdICs9IHNpZ24gKiAoZGlzdCAqIGRpc3QgJSBNT0QgKiBzdW1fbWluX2Rpc3QgJSBNT0QgKyAyICogZGlzdCAqIHN1bV9kaXN0ICUgTU9EICsgc3VtX3NxdWFyZV9kaXN0KSkgJT0gTU9EOwogICAgICAgIChzdW1fZGlzdCArPSBtaW5fZGlzdCAqIGRpc3QgJSBNT0QpICU9IE1PRDsKICAgICAgICAoc3VtX3NxdWFyZV9kaXN0ICs9IG1pbl9kaXN0ICogZGlzdCAlIE1PRCAqIGRpc3QgJSBNT0QpICU9IE1PRDsKICAgICAgICAoc3VtX21pbl9kaXN0ICs9IG1pbl9kaXN0KSAlPSBNT0Q7CiAgICB9Cn0Kdm9pZCBjZW50cm9pZF9kZWNvbXBvc2l0aW9uKGludCB0b3ApCnsKICAgIGJ1aWxkX3N6KHRvcCk7CiAgICBpbnQgY2VudHJvaWQgPSBmaW5kX2NlbnRyb2lkKHRvcCwgLTEsIHN6W3RvcF0pOwogICAgZGVsW2NlbnRyb2lkXSA9IDE7CgogICAgY19nbG9iYWwucHVzaF9iYWNrKEl0ZW0oY2VudHJvaWQsIElORiwgMCkpOwoKICAgIGZvciAoaWkgcHIgOiBhZGpbY2VudHJvaWRdKQogICAgewogICAgICAgIGludCBuZXh0X3RvcCA9IHByLmZpOwogICAgICAgIGxsIHcgPSBwci5zZTsKICAgICAgICBpZiAoZGVsW25leHRfdG9wXSkKICAgICAgICAgICAgY29udGludWU7CiAgICAgICAgdHJhdmVsc2VsKG5leHRfdG9wLCBjZW50cm9pZCwgdywgMSk7CiAgICAgICAgY2FsYyhjX2ludGVybmFsLCAtMSk7CiAgICAgICAgY19pbnRlcm5hbC5jbGVhcigpOwogICAgfQogICAgY2FsYyhjX2dsb2JhbCwgMSk7CiAgICBjX2dsb2JhbC5jbGVhcigpOwoKICAgIGZvciAoaWkgcHIgOiBhZGpbY2VudHJvaWRdKQogICAgewogICAgICAgIGludCBuZXh0X3RvcCA9IHByLmZpOwogICAgICAgIGlmIChkZWxbbmV4dF90b3BdKQogICAgICAgICAgICBjb250aW51ZTsKICAgICAgICBjZW50cm9pZF9kZWNvbXBvc2l0aW9uKG5leHRfdG9wKTsKICAgIH0KfQoKaW50IG1haW4oKQp7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKICAgIGlmIChmb3BlbigiTkVUVy5JTlAiLCAiciIpKQogICAgewogICAgICAgIGZyZW9wZW4oIk5FVFcuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbigiTkVUVy5PVVQiLCAidyIsIHN0ZG91dCk7CiAgICB9CgogICAgY2luID4+IG47CiAgICBmb3IgKGludCBpID0gMTsgaSA8IG47IGkrKykKICAgIHsKICAgICAgICBpbnQgeCwgeTsKICAgICAgICBsbCB3OwogICAgICAgIGNpbiA+PiB4ID4+IHkgPj4gdzsKICAgICAgICBhZGpbeF0ucHVzaF9iYWNrKHt5LCB3fSk7CiAgICAgICAgYWRqW3ldLnB1c2hfYmFjayh7eCwgd30pOwogICAgfQogICAgY2VudHJvaWRfZGVjb21wb3NpdGlvbigxKTsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykKICAgICAgICBjb3V0IDw8IChhbnNbaV0gKyBNT0QpICUgTU9ELCBlbDsKfQo=