Cod sursa(job #466410)
#include <stdio.h>
#include <vector>
#define NMAX 100005
#define LMAX 300005
#define pb push_back
#define MOD 1000000007
#define ll long long
using namespace std;
int n,k,dad[NMAX],fact[LMAX];
vector <int> A[NMAX],C[NMAX];
ll B[NMAX],pos[NMAX],prod[NMAX];
char viz[NMAX];
void read()
{
scanf("%d%d",&n,&k);
int i,x,y;
for (i=1; i<n; i++)
{
scanf("%d%d",&x,&y);
A[x].pb(y);
A[y].pb(x);
}
}
void precompute()
{
fact[0]=1;
int i;
ll part;
for (i=1; i<=300000; i++)
{
part=(ll)fact[i-1]*i;
if (part>=MOD)
part%=MOD;
fact[i]=part;
}
}
ll lgput(int baza,int exp)
{
ll part=1,part2=baza;
while (exp)
{
if (exp & 1)
part*=part2,part%=MOD;
part2*=part2;
part2%=MOD;
exp>>=1;
}
return part;
}
void dfs(int nod)
{
viz[nod]=1; pos[nod]=1;
int i,vec;
for (i=0; i<A[nod].size(); i++)
{
vec=A[nod][i];
if (!viz[vec])
{
dad[vec]=nod;
C[nod].pb(vec);
dfs(vec);
}
}
int act=k,p=C[nod].size();
if (dad[nod])
act--;
if (p)
{
pos[nod]=(ll)fact[act]*lgput(fact[act-p],MOD-2);
if (pos[nod]>=MOD)
pos[nod]%=MOD;
}
prod[nod]=pos[nod];
for (i=0; i<C[nod].size(); i++)
{
vec=C[nod][i];
prod[nod]*=prod[vec];
if (prod[nod]>=MOD)
prod[nod]%=MOD;
}
}
int main()
{
freopen("colorare3.in","r",stdin);
freopen("colorare3.out","w",stdout);
read();
precompute();
dfs(1);
printf("%lld\n",prod[1]);
return 0;
}