{
if(edge[i].v == pre) continue;
if(bj != -1 && (i == bj || i == (bj ^ 1))) continue;
val[c].hash = hash[edge[i].v];
val[c++].ans = ans[edge[i].v];
}
sort(val , val + num);
hash[st] = leaf;
for(int i=0;i
int j = i;
for(;j
hash[st] *= yin;
hash[st] ^= val[j].hash;
hash[st] %= mod;
}
hash[st] = hash[st] * yy % mod;
ans[st] *= C(val[i].ans + j - i - 1, j - i);
i = j;
}
return;
}
int main()
{
prepare();
while(~scanf("%d %d",&n,&m))
{
init();
read();
make();
dfs(root , 0);
printf("%I64d\n",ans[root]);
}
return 0;
}