#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <iostream>
using namespace std;
#define ref(i,x,y)for(int i=x;i<=y;++i)
const int N=5001,mod=1e9+7;typedef long long LL;
int n,m,x,y,o,cnt,a[N],head[N],sz[N],f[2][N],c[N][N],p[N][N],F[N];
struct xint{int to,next;}e[N*2];
void add(int x,int y){e[++cnt]=(xint){y,head[x]};head[x]=cnt;}
void Add(int x,int y){add(x,y);add(y,x);}
int solve(int M){
	memset(f,0,sizeof f);
	F[0]=1;
	ref(i,1,n)F[i]=(LL)F[i-1]*i%mod;
	ref(i,0,n)c[i][0]=p[i][0]=1;
	ref(i,1,n)ref(j,1,i)c[i][j]=(c[i-1][j-1]+c[i-1][j])%mod;
	ref(i,1,n)ref(j,1,i)p[i][j]=(LL)p[i][j-1]*(i-j+1)%mod;
	f[0][0]=1;int sum=0;
	ref(i,1,M){
		ref(j,0,sum){
			LL S=f[0][j];if(!S)continue;
			ref(k,0,a[i]){
				f[1][j+k]+=S*c[a[i]][k]%mod*p[a[i]][k]%mod;
				if(f[1][j+k]>=mod)f[1][j+k]-=mod;
			}
		}
		sum+=a[i];
		ref(j,0,sum)f[0][j]=f[1][j],f[1][j]=0;
	}
	int res=0;
	ref(i,0,sum)if(i&1)res=(res+mod-(LL)f[0][i]*F[sum-i]%mod)%mod;
		else res=(res+(LL)f[0][i]*F[sum-i]%mod)%mod;
	return res;
}
void work(int f,int x){
	for(int i=head[x];i;i=e[i].next){
		int y=e[i].to;if(y==f)continue;
		a[++m]=sz[y];
	}
	if(x!=1)a[++m]=n-sz[x];a[m+1]=1;
	int ans=(solve(m)+solve(m+1))%mod;
	//ref(i,1,m)ref(j,2,a[i])ans=(LL)ans*j%mod;
	printf("%d\n",ans);
	exit(0);
}
void dfs(int f,int x){
	bool flag=1;sz[x]=1;
	for(int i=head[x];i;i=e[i].next){
		int y=e[i].to;if(y==f)continue;
		dfs(x,y);sz[x]+=sz[y];if(sz[y]>n/2)flag=0;
	}
	if(n-sz[x]>n/2)flag=0;if(flag)work(f,x);
}
int main(){
	scanf("%d",&n);
	ref(i,2,n){scanf("%d%d",&x,&y);Add(x,y);}
	dfs(0,1);printf("0\n");
}