#include using namespace std; #include using mint = atcoder::modint998244353; set cycle(vector> &G) { int N = G.size(); set ret; vector path; vector vis_in(N), vis_out(N); auto dfs = [&](auto dfs, int cur, int pre) -> void { path.push_back(cur); vis_in[cur] = true; for( int &nxt : G[cur] ) { if( nxt == pre ) continue; if( !vis_in[nxt] ) { dfs(dfs, nxt, cur); }else if( !vis_out[nxt] ) { int s = find(path.begin(), path.end(), nxt)-path.begin(); for( int i = s; i < path.size(); i++ ) ret.insert(path[i]); } } path.pop_back(); vis_out[cur] = true; }; dfs(dfs, 0, -1); return ret; } int main() { long long N, K; cin >> N >> K; vector> G(N); for( int i = 0; i < N; i++ ) { int u, v; cin >> u >> v; u--, v--; G[u].push_back(v); G[v].push_back(u); } set S = cycle(G); vector dp(S.size()+1); for( int i = 2; i <= S.size(); i++ ) { dp[i] = K*mint(K-1).pow(i-1)-dp[i-1]; } // for( int v : S ) cout << v+1 << endl; cout << (dp[S.size()]*mint(K-1).pow(N-S.size())).val() << endl; }