#include<bits/stdc++.h>
using namespace std;
const long long MX=5010,MO=1e9+7;
vector<long long>vec[MX];
inline void update(long long &x,long long y){x+=y;if(x>=MO)x-=MO;}
long long dp[MX][MX],g[MX],C[MX][MX],siz[MX],n;
void dfs(long long now,long long fa){
dp[now][1]=1;
siz[now]=1;
for(auto to:vec[now]){
if(to==fa)continue;
dfs(to,now);
for(long long j=1;j<=siz[now];j++){
if(dp[now][j]) for(long long l=j;l<=j+siz[to];l++) update(g[l],((dp[now][j]*dp[to][l-j]%MO)*C[l-1][j-1])%MO);
}
siz[now]+=siz[to];
for(long long j=1;j<=siz[now];j++) dp[now][j]=g[j],g[j]=0;
}
for(long long j=siz[now];j>=0;j--) update(dp[now][j],dp[now][j+1]);
}
signed main(){
scanf("%lld",&n);
for(long long i=1;i<n;i++){
long long x,y;scanf("%lld%lld",&x,&y);
vec[x].push_back(y),vec[y].push_back(x);
}
C[0][0]=1;
for(long long i=1;i<=n;i++){
C[i][0]=1;
for(long long j=1;j<=i;j++) C[i][j]=(C[i-1][j-1]+C[i-1][j])%MO;
}
dfs(1,0);
printf("%lld\n",dp[1][0]);
return 0;
}