#include #include #pragma GCC optimize("Ofast") #pragma GCC optimize("unroll-loops") using namespace std; using mint = atcoder::modint998244353; int main() { cin.tie(0); cout.tie(0); ios::sync_with_stdio(false); int N, K; cin >> N >> K; vector u(N), v(N); vector>> G(N); for(int i = 0; i < N; i++) { cin >> u[i] >> v[i]; --u[i]; --v[i]; G[u[i]].push_back(make_pair(v[i], i)); G[v[i]].push_back(make_pair(u[i], i)); } vector seen(N, -1); vector used(N, false); seen[0] = 0; queue que; que.push(0); while(!que.empty()) { int x = que.front(); que.pop(); for(pair p : G[x]) { int y = p.first; int id = p.second; if(seen[y] == -1) { seen[y] = seen[x] + 1; que.push(y); used[id] = true; } } } vector> H(N); for(int i = 0; i < N; i++) { if(used[i]) { H[u[i]].emplace_back(v[i]); H[v[i]].emplace_back(u[i]); } } if(K == 2) { for(int i = 0; i < N; i++) { if(!used[i]) { if(seen[u[i]] % 2 != seen[v[i]] % 2) { cout << 2 << '\n'; } else { cout << 0 << '\n'; } } } } else { for(int i = 0; i < N; i++) { if(!used[i]) { vector dep(N, -1); dep[u[i]] = 1; vector> dp(N, vector(2)); dp[u[i]][0] = 1; dp[u[i]][1] = 0; que.push(u[i]); while(!que.empty()) { int x = que.front(); que.pop(); for(int y : H[x]) { if(dep[y] == -1) { que.push(y); dep[y] = dep[x] + 1; dp[y][0] += dp[x][1]; dp[y][1] += dp[x][0] * (K - 1); dp[y][1] += dp[x][1] * (K - 2); } } } int d = dep[v[i]]; mint ans = mint(K) * mint(K - 1).pow(N - 1); mint rem = mint(K) * mint(K - 1).pow(N - d) * dp[v[i]][0]; ans -= rem; cout << ans.val() << '\n'; } } } return 0; }