#include using namespace std; using Int = long long; const char newl = '\n'; template inline void chmin(T1 &a,T2 b){if(a>b) a=b;} template inline void chmax(T1 &a,T2 b){if(a void drop(const T &x){cout< vector read(size_t n){ vector ts(n); for(size_t i=0;i>ts[i]; return ts; } template struct Mint{ static constexpr T mod = MOD; T v; Mint():v(0){} Mint(signed v):v(v){} Mint(long long t){v=t%MOD;if(v<0) v+=MOD;} Mint pow(long long k){ Mint res(1),tmp(v); while(k){ if(k&1) res*=tmp; tmp*=tmp; k>>=1; } return res; } static Mint add_identity(){return Mint(0);} static Mint mul_identity(){return Mint(1);} Mint inv(){return pow(MOD-2);} Mint& operator+=(Mint a){v+=a.v;if(v>=MOD)v-=MOD;return *this;} Mint& operator-=(Mint a){v+=MOD-a.v;if(v>=MOD)v-=MOD;return *this;} Mint& operator*=(Mint a){v=1LL*v*a.v%MOD;return *this;} Mint& operator/=(Mint a){return (*this)*=a.inv();} Mint operator+(Mint a) const{return Mint(v)+=a;} Mint operator-(Mint a) const{return Mint(v)-=a;} Mint operator*(Mint a) const{return Mint(v)*=a;} Mint operator/(Mint a) const{return Mint(v)/=a;} Mint operator-() const{return v?Mint(MOD-v):Mint(v);} bool operator==(const Mint a)const{return v==a.v;} bool operator!=(const Mint a)const{return v!=a.v;} bool operator <(const Mint a)const{return v constexpr T Mint::mod; template ostream& operator<<(ostream &os,Mint m){os< struct FixPoint : F{ FixPoint(F&& f):F(forward(f)){} template decltype(auto) operator()(Args&&... args) const{ return F::operator()(*this,forward(args)...); } }; template inline decltype(auto) MFP(F&& f){ return FixPoint{forward(f)}; } //INSERT ABOVE HERE signed main(){ cin.tie(0); ios::sync_with_stdio(0); int n,k; cin>>n>>k; vector> S(n); for(int i=0;i>a>>b; a--;b--; S[a].emplace(b); S[b].emplace(a); } vector> T(n); queue que; for(int i=0;i in_loop=[&](){ int pos=-1; for(int i=0;i0) pos=i; assert(~pos); vector res; while(not S[pos].empty()){ res.emplace_back(pos); int nxt=*S[pos].begin(); S[pos].erase(nxt); S[nxt].erase(pos); pos=nxt; } return res; }(); using M = Mint; M ans{0}; vector dp(n); vector sz(n); M inv=(M(1)-M(k)).inv(); // not use loop for(int r:in_loop){ MFP([&](auto dfs,int v)->void{ sz[v]=1; for(int u:T[v]){ dfs(u); sz[v]+=sz[u]; } dp[v]=inv.pow(sz[v])-M(1); for(int u:T[v]) dp[v]+=dp[u]*inv.pow(sz[v]-sz[u]); // see from descents for(int u:T[v]) ans+=(inv.pow(sz[v]-sz[u])-M(1))*dp[u]; // see from v M zero=1; M one=0; M all=inv.pow(sz[v]-1); for(int u:T[v]) one+=inv.pow(sz[u])-M(1); ans+=M(k)*inv*zero; ans+=M(k)*inv*one; ans+=inv*(all-(zero+one)); })(r); } auto calc=MFP([&](auto dfs,int r,int v)->M{ M res=inv.pow(sz[v])-M(1); if(v==r) res+=M(1); for(int u:T[v]) res+=dfs(r,u)*inv.pow(sz[v]-sz[u]); return res; }); // use all edges in loop for(int r:in_loop) ans+=calc(r,r)*inv.pow(n-sz[r]); // use partial edges in loop // prepare int num=0; M sum{0}; M uku{0}; auto proceed=[&](int r){ sum*=inv.pow(sz[r]); uku*=inv.pow(sz[r]); sum+=calc(r,r)*inv.pow(num+n); uku-=M(1); num+=sz[r]; }; for(int r:in_loop) proceed(r); assert(num==n); // add for(int r:in_loop){ // see from r's subtree ans+=MFP([&](auto dfs,int v)->M{ // OK M res=inv.pow(sz[v])-M(1); for(int u:T[v]) res+=dfs(u)*inv.pow(sz[v]-sz[u]); return res; })(r)*(inv.pow(n-sz[r])-M(1)); // see from left sum-=calc(r,r)*inv.pow(num+n-n)*inv.pow(n-sz[r]); uku+=M(1)*inv.pow(n-sz[r]); ans+=(sum/inv.pow(num+sz[r])+uku)*(inv.pow(sz[r])-M(1)); proceed(r); } ans/=inv.pow(n); cout<