#include <iostream>
                    #include <vector>
                    typedef long long int ll; 
                    using namespace std;
                    using Graph = vector<vector<ll>>;
                    
                    
                    // xx, yyにa*xx+b*yy=1な整数が格納される。
                    // 負の場合もあるので注意！
                    
                    ll extGCD(ll a, ll b, ll &x, ll &y) {
                        if (b == 0) {
                            x = 1;
                            y = 0;
                            return a;
                        }
                        ll d = extGCD(b, a%b, y, x);
                        y -= a/b * x;
                        return d;
                    }                    
                    
                    
                    //入力頂点番号を１マイナスしてずらしているので注意!
                    //枝の数がM=N-1で以下では木になっているが変更可能
                    // 深さ優先探索
                    vector<bool> seen;
                    ll dfs(const Graph &G, ll v, ll K) {

                        
                        ll P=1000*1000*1000+7;
                        ll xx, yy;
                        extGCD(K-1,P,xx,yy);
                        
                        if(xx<0){
                            xx = (-xx)%P;
                            xx = P-xx;
                        }                         
                        
                        seen[v] = true; // v を訪問済にする
                        //cout<< v <<endl;
                        if( G[v].size()==1 && v!=0 ){
                            //cout<< v<<" "<<1<<endl; 
                            return 1; 
                        }else{
                                // v から行ける各頂点 next_v について
                                ll x=1; 
                                for (auto next_v : G[v]) { 
                                    if (seen[next_v]) continue; // next_v が探索済だったらスルー
                                    x = (x*dfs(G, next_v , K))%P; // 再帰的に探索
                                    x = (x*( K - G[next_v].size() ) )%P;
                                    x = (x*xx)%P; 
                                }
                                
                                if(v!=0){
                                    for(ll i=1; i<G[v].size(); i++){
                                        x = (x*(K-i))%P;
                                    }
                                }else{
                                    for(ll i=1; i<=G[v].size(); i++){
                                        x = (x*(K-i))%P;
                                    }
                                }
                                
                                //cout<< v<<" "<<x<<endl; 
                                return x; 
                        }
                    
                        
                    }
                    
                    int main() {
                        // 頂点数と辺数
                        ll N, M; cin >> N;
                        M= N-1; 
                        ll K;
                        cin>>K; 

                        // グラフ入力受取 (ここでは無向グラフを想定)
                        Graph G(N);
                        for (ll i = 0; i < M; ++i) {
                            ll a, b;
                            cin >> a >> b;
                            G[a-1].push_back(b-1);
                            G[b-1].push_back(a-1);
                        }
                        
                    
                        // 頂点 0 をスタートとした探索
                        seen.assign(N, false); // 全頂点を「未訪問」に初期化
                        
                        ll P=1000*1000*1000+7;
                        cout<< (K*dfs(G, 0, K))%P ;
                        
                        
                        
                    }

Measured memory_bytes: 13952