#pragma GCC optimize("O3")
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MOD = 998244353;
const int N = 100069;
const int LOG_N = 17;
const int INF = 1000000069;
int n;
vector<pair<int,int>> graph[N];
int weight[N];
namespace CD {
bitset<N> banned;
int sz[N];
int centroid[LOG_N][N];
int heightLevel[LOG_N][N];
int minWeight[LOG_N][N];
vector<pair<int,int>> levelList[2][N];
vector<pair<int,int>> prefixSumList[2][N];
vector<array<int,3>> prefixProdList[2][N];
int positionIndex[2][LOG_N][N];
int depthOfCentroid[N];
vector<int> distinctWeights[2][N];
void computeSize(int u, int parent) {
sz[u] = 1;
for (auto &e : graph[u]) {
int v = e.first, id = e.second;
if (v == parent || banned[id]) continue;
computeSize(v, u);
sz[u] += sz[v];
}
}
int findCentroid(int u, int parent, int total) {
for (auto &e : graph[u]) {
int v = e.first, id = e.second;
if (v == parent || banned[id]) continue;
if (sz[v] * 2 > total)
return findCentroid(v, u, total);
}
return u;
}
void dfs(int u, int parent, int layer) {
for (auto &e : graph[u]) {
int v = e.first, id = e.second;
if (v == parent || banned[id]) continue;
centroid[layer][v] = centroid[layer][u];
heightLevel[layer][v] = heightLevel[layer][u] + 1;
minWeight[layer][v] = min(minWeight[layer][u], weight[id]);
dfs(v, u, layer);
}
}
void collect(int u, int parent, int layer, vector<pair<int,int>> &out) {
out.emplace_back(minWeight[layer][u], u);
for (auto &e : graph[u]) {
int v = e.first, id = e.second;
if (v == parent || banned[id]) continue;
collect(v, u, layer, out);
}
}
void build(int entry, int layer) {
computeSize(entry, -1);
int c = findCentroid(entry, -1, sz[entry]);
centroid[layer][c] = c;
heightLevel[layer][c] = 0;
minWeight[layer][c] = INF;
dfs(c, -1, layer);
vector<pair<int,int>> nodes;
collect(c, -1, layer, nodes);
sort(nodes.begin(), nodes.end());
levelList[0][c] = nodes;
depthOfCentroid[c] = layer;
for (auto &e : graph[c]) {
int v = e.first, id = e.second;
if (banned[id]) continue;
banned[id] = true;
build(v, layer + 1);
}
for (auto &p : nodes) {
if (p.second == c) continue;
int root = centroid[layer + 1][p.second];
levelList[1][root].push_back(p);
}
}
inline ll square(ll x) { return (x * x) % MOD; }
inline ll modNormalize(ll x) { x %= MOD; return x < 0 ? x + MOD : x; }
void init() {
for (int x = 0; x < 2; ++x) {
for (int i = 1; i <= n; ++i) {
auto &vec = levelList[x][i];
if (vec.empty()) continue;
int m = vec.size();
distinctWeights[x][i].resize(m);
for (int j = 0; j < m; ++j)
distinctWeights[x][i][j] = vec[j].first;
vector<int> pref(m);
pref[0] = 0;
for (int j = 1; j < m; ++j) {
if (distinctWeights[x][i][j] != distinctWeights[x][i][j-1])
pref[j] = j;
else pref[j] = pref[j-1];
}
prefixSumList[x][i].resize(m);
prefixProdList[x][i].resize(m);
for (int j = 0; j < m; ++j) {
int h = heightLevel[depthOfCentroid[i] - x][ vec[j].second ];
prefixSumList[x][i][j] = { h, square(h) };
int w = vec[j].first;
prefixProdList[x][i][j] = { w, (int)(1LL * h * w % MOD), (int)(1LL * square(h) * w % MOD) };
positionIndex[x][depthOfCentroid[i]][ vec[j].second ] = pref[j];
}
for (int j = m - 2; j >= 0; --j) {
prefixSumList[x][i][j].first = (prefixSumList[x][i][j].first + prefixSumList[x][i][j+1].first) % MOD;
prefixSumList[x][i][j].second = (prefixSumList[x][i][j].second + prefixSumList[x][i][j+1].second) % MOD;
}
for (int j = 1; j < m; ++j) {
for (int k = 0; k < 3; ++k) {
prefixProdList[x][i][j][k] = (prefixProdList[x][i][j][k] + prefixProdList[x][i][j-1][k]) % MOD;
}
}
}
}
}
ll query(int u) {
ll ans = 0;
for (int level = 0; level < LOG_N; ++level) {
int c = centroid[level][u];
int idx = positionIndex[0][level][u];
ll h_u = heightLevel[level][u];
ll h_sq = square(h_u);
int m = levelList[0][c].size();
ll cur = 0;
if (idx < m) {
auto &S = prefixSumList[0][c][idx];
cur = (h_sq * (m - idx) + S.second + 2 * h_u * S.first) % MOD;
}
cur = cur * minWeight[level][u] % MOD;
if (idx > 0) {
auto &P = prefixProdList[0][c][idx-1];
cur = (cur + h_sq * P[0] + 2 * h_u * P[1] + P[2]) % MOD;
}
ans = (ans + cur) % MOD;
if (c == u) break;
int c2 = centroid[level+1][u];
idx = positionIndex[1][level+1][u];
m = levelList[1][c2].size();
cur = 0;
if (idx < m) {
auto &S = prefixSumList[1][c2][idx];
cur = (h_sq * (m - idx) + S.second + 2 * h_u * S.first) % MOD;
}
cur = cur * minWeight[level][u] % MOD;
if (idx > 0) {
auto &P = prefixProdList[1][c2][idx-1];
cur = (cur + h_sq * P[0] + 2 * h_u * P[1] + P[2]) % MOD;
}
ans = (ans - cur) % MOD;
if (ans < 0) ans += MOD;
}
return ans;
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
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 u, v, w;
cin >> u >> v >> w;
graph[u].push_back({v, i});
graph[v].push_back({u, i});
weight[i] = w;
}
CD::build(1, 0);
CD::init();
for (int i = 1; i <= n; ++i) {
cout << CD::query(i) << '\n';
}
return 0;
}