#include <bits/stdc++.h>
using namespace std;
typedef long long ll;


#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 1000000000
#define mod 1000000007
#define fi first
#define sc second
#define rep(i,x) for(long long i=0;i<x;i++)
#define repn(i,x) for(long long i=1;i<=x;i++)
#define SORT(x) sort(x.begin(),x.end())
#define ERASE(x) x.erase(unique(x.begin(),x.end()),x.end())
#define POSL(x,v) (lower_bound(x.begin(),x.end(),v)-x.begin())
#define POSU(x,v) (upper_bound(x.begin(),x.end(),v)-x.begin())


#define MAX_V 100001

long long K;
long long N;
vector<long long> a((MAX_V-1)-1+1);
vector<long long> b((MAX_V-1)-1+1);
map<ll, ll> m;
vector<ll> G[MAX_V];

const long long MAX_P = 200001;

// 入力はすべて正とする
// 素数判定O(√n)
bool is_prime(long long n) {
	for (long long i = 2; i * i <= n; i++) {
		if (n % i == 0) return false;
	}
	return n != 1; // 1の場合は例外
}
// 約数の列挙O(√n)
vector<long long> divisor(long long n) {
	vector<long long> res;
	for (long long i = 1; i * i <= n; i++) {
  	if (n % i == 0) {
			res.push_back(i);
			if (i != n / i) res.push_back(n / i);
		}
	}
	return res;
}
// 素因数分解O(√n)
map<long long, long long> prime_factor(long long n) {
	map<long long, long long> res;
	for (long long i = 2; i * i <= n; i++) {
		while (n % i == 0) {
			++res[i];
			n /= i;
		}
	}
	if (n != 1) res[n] = 1;
	return res;
}

long long extgcd(long long a, long long b, long long& x, long long& y) {
	long long d = a;
	if (b != 0) {
		d = extgcd(b, a % b, y, x);
		y -= (a / b) * x;
	} else {
		x = 1; y = 0;
	}
	return d;
}

long long mod_inverse(long long a, long long m) {
	long long x, y;
	extgcd(a, m, x, y);
	return (m + x % m) % m;
}

long long fact[MAX_P+1];
// n! mod pのテーブルを作る O(p)
void mod_fact(long long n, long long m) {
	fact[0] = 1;
	for (long long i = 1; i <= n; i++) fact[i] = fact[i-1]*i%m;
}

// n!=a p^e としたときのa mod pを求める。O(log_p n)
long long mod_fact(long long n, long long p, long long& e) {
	e = 0;
	if (n == 0) return 1;
	// pの倍数の部分を計算
	long long res = mod_fact(n / p, p, e);
	e += n / p;
	// (p-1)!≡-1なので(p-1)!^(n/p)はn/pの偶奇だけで計算できる
	if (n / p % 2 != 0) return res * (p - fact[n % p]) % p;
	return res * fact[n % p] % p;
}

// nCk mod pを求める。O(log_p n)
long long mod_comb(long long n, long long k, long long p) {
	if (n < 0 || k < 0 || n < k) return 0;
	long long e1, e2, e3;
	long long a1 = mod_fact(n, p, e1), a2 = mod_fact(k, p, e2), a3 = mod_fact(n - k, p, e3);
	//if (a1 * mod_inverse(a2 * a3 % p, p) % p == 0) printf("%lld, %lld, %lld,%lld, %lld, %lld\n",n, p, e1,a1, a2, a3);
	if (e1 > e2 + e3) return 0;
	return a1 * mod_inverse(a2 * a3 % p, p) % p;
}

ll rec(ll p, ll v, ll depth) {
	ll res = 1;
	if (depth == 0) {
		res = res*mod_comb(K,(ll)G[v].size()+1,mod)%mod;
		res = res*fact[(ll)G[v].size()+1]%mod;
		// cout << res << endl;
	} else {
		res = res*mod_comb(K-2,(ll)G[v].size()-1,mod)%mod;
		// if (layer < 0) cout << layer << " " << mod_comb(K-1,layer,mod) << endl;
		res = res*fact[(ll)G[v].size()-1]%mod;
		// cout << depth << " " << res << " " << (ll)G[p].size() << " " << mod_comb(K-2,(ll)G[p].size(),mod) << endl;
	}
	rep(i, (ll)G[v].size()) {
		if (G[v][i] != p) res = res*rec(v, G[v][i], depth+1)%mod;
	}
	return res;
}

int main() {
	scanf("%lld",&N);	
	scanf("%lld",&K);
	for(int i = 0 ; i <= (N-1)-1 ; i++){
		scanf("%lld",&a[i]);
		scanf("%lld",&b[i]);
		a[i]--;
		b[i]--;
		m[a[i]]++;
		m[b[i]]++;
		G[a[i]].push_back(b[i]);
		G[b[i]].push_back(a[i]);
	}
	mod_fact(MAX_P,mod);
	// cout << G[0].size() << endl;
	// cout << G[1].size() << endl;
	// cout << G[2].size() << endl;
	// cout << G[3].size() << endl;
	cout << rec(-1, 0, 0) << endl;
	return 0;
}



Measured memory_bytes: 20992