#include<bits/stdc++.h>

using namespace std;

#define LL long long
#define N 5005
#define INF 0x3f3f3f3f3f3f3f3fLL

const LL mod=1000000007;

LL n,m,x,y,ans,c,tot,sum,a[N],sz[N],mx[N],head[N],fac[N],ifac[N],f[N][N];
struct edge{LL v,nxt;}e[N*2];

void add(LL x,LL y){e[++tot].v=y; e[tot].nxt=head[x]; head[x]=tot;}

void dfs(LL u,LL fa){
	sz[u]=1; mx[u]=0;
	for (LL i=head[u],v;i;i=e[i].nxt)
		if ((v=e[i].v)!=fa){
			dfs(v,u); sz[u]+=sz[v]; mx[u]=max(mx[u],sz[v]);
		}
	mx[u]=max(mx[u],n-sz[u]);
	if (mx[u]<mx[c]) c=u;
}

void getsz(LL u,LL fa){
	sz[u]=1;
	for (LL i=head[u],v;i;i=e[i].nxt)
		if ((v=e[i].v)!=fa){
			dfs(v,u); sz[u]+=sz[v];
		}
}

LL inv(LL x){return x==1?1:(mod-mod/x)*inv(mod%x)%mod;}

LL C(LL x,LL y){return fac[x]*ifac[y]%mod*ifac[x-y]%mod;}

LL P(LL x,LL y){return fac[x]*ifac[x-y]%mod;}

int main(){
	scanf("%lld",&n);
	for (LL i=1;i<n;i++){
		scanf("%lld%lld",&x,&y);
		add(x,y); add(y,x);
	}
	mx[c=0]=INF; dfs(1,0);
	for (LL i=1;i<=n;i++)
		if (i!=c && mx[i]==mx[c]){
			ans=1;
			for (LL i=1;i<=n/2;i++)
				(ans*=i)%=mod;
			printf("%lld\n",ans*ans%mod);
			return 0;
		}
	getsz(c,0);
	for (LL i=head[c];i;i=e[i].nxt)
		a[++m]=sz[e[i].v];
	sum=0;
	fac[0]=1; for (LL i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
	ifac[n]=inv(fac[n]); for (LL i=n-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
	f[0][0]=1;
	for (LL i=1;i<=m;i++){
		sum+=a[i];
		for (LL j=0;j<=sum;j++)
			for (LL k=0;k<=a[i] && k<=j;k++)
				(f[i][j]+=f[i-1][j-k]*C(a[i],k)%mod*P(a[i],k)%mod)%=mod;
	}
	for (LL i=0;i<=n;i++) (ans+=f[m][i]*fac[n-i]%mod*(i&1?-1:1)+mod)%=mod;
	printf("%lld\n",ans);
	
	return 0;
}
			
### Prompt

Your task is to create a Cpp solution to the following problem:

There is a tree with N vertices. The vertices are numbered 1 through N. The i-th edge (1 \leq i \leq N - 1) connects Vertex x_i and y_i. For vertices v and w (1 \leq v, w \leq N), we will define the distance between v and w d(v, w) as "the number of edges contained in the path v-w".

A squirrel lives in each vertex of the tree. They are planning to move, as follows. First, they will freely choose a permutation of (1, 2, ..., N), p = (p_1, p_2, ..., p_N). Then, for each 1 \leq i \leq N, the squirrel that lived in Vertex i will move to Vertex p_i.

Since they like long travels, they have decided to maximize the total distance they traveled during the process. That is, they will choose p so that d(1, p_1) + d(2, p_2) + ... + d(N, p_N) will be maximized. How many such ways are there to choose p, modulo 10^9 + 7?

Constraints

* 2 \leq N \leq 5,000
* 1 \leq x_i, y_i \leq N
* The input graph is a tree.

Input

Input is given from Standard Input in the following format:


N
x_1 y_1
x_2 y_2
:
x_{N - 1} y_{N - 1}


Output

Print the number of the ways to choose p so that the condition is satisfied, modulo 10^9 + 7.

Examples

Input

3
1 2
2 3


Output

3


Input

4
1 2
1 3
1 4


Output

11


Input

6
1 2
1 3
1 4
2 5
2 6


Output

36


Input

7
1 2
6 3
4 5
1 7
1 5
2 3


Output

396

### Response

```cpp
#include<bits/stdc++.h>

using namespace std;

#define LL long long
#define N 5005
#define INF 0x3f3f3f3f3f3f3f3fLL

const LL mod=1000000007;

LL n,m,x,y,ans,c,tot,sum,a[N],sz[N],mx[N],head[N],fac[N],ifac[N],f[N][N];
struct edge{LL v,nxt;}e[N*2];

void add(LL x,LL y){e[++tot].v=y; e[tot].nxt=head[x]; head[x]=tot;}

void dfs(LL u,LL fa){
	sz[u]=1; mx[u]=0;
	for (LL i=head[u],v;i;i=e[i].nxt)
		if ((v=e[i].v)!=fa){
			dfs(v,u); sz[u]+=sz[v]; mx[u]=max(mx[u],sz[v]);
		}
	mx[u]=max(mx[u],n-sz[u]);
	if (mx[u]<mx[c]) c=u;
}

void getsz(LL u,LL fa){
	sz[u]=1;
	for (LL i=head[u],v;i;i=e[i].nxt)
		if ((v=e[i].v)!=fa){
			dfs(v,u); sz[u]+=sz[v];
		}
}

LL inv(LL x){return x==1?1:(mod-mod/x)*inv(mod%x)%mod;}

LL C(LL x,LL y){return fac[x]*ifac[y]%mod*ifac[x-y]%mod;}

LL P(LL x,LL y){return fac[x]*ifac[x-y]%mod;}

int main(){
	scanf("%lld",&n);
	for (LL i=1;i<n;i++){
		scanf("%lld%lld",&x,&y);
		add(x,y); add(y,x);
	}
	mx[c=0]=INF; dfs(1,0);
	for (LL i=1;i<=n;i++)
		if (i!=c && mx[i]==mx[c]){
			ans=1;
			for (LL i=1;i<=n/2;i++)
				(ans*=i)%=mod;
			printf("%lld\n",ans*ans%mod);
			return 0;
		}
	getsz(c,0);
	for (LL i=head[c];i;i=e[i].nxt)
		a[++m]=sz[e[i].v];
	sum=0;
	fac[0]=1; for (LL i=1;i<=n;i++) fac[i]=fac[i-1]*i%mod;
	ifac[n]=inv(fac[n]); for (LL i=n-1;i>=0;i--) ifac[i]=ifac[i+1]*(i+1)%mod;
	f[0][0]=1;
	for (LL i=1;i<=m;i++){
		sum+=a[i];
		for (LL j=0;j<=sum;j++)
			for (LL k=0;k<=a[i] && k<=j;k++)
				(f[i][j]+=f[i-1][j-k]*C(a[i],k)%mod*P(a[i],k)%mod)%=mod;
	}
	for (LL i=0;i<=n;i++) (ans+=f[m][i]*fac[n-i]%mod*(i&1?-1:1)+mod)%=mod;
	printf("%lld\n",ans);
	
	return 0;
}
			
```