#include <stdio.h>
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits.h>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <time.h>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:336777216")
using namespace std;

#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define ldb ldouble

typedef tuple<int, int, int> t3;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair <ll, int> pli;
typedef pair <db, db> pdd;

int IT_MAX = 1 << 18;
const ll MOD = 1000000007;
const int INF = 0x3f3f3f3f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const db PI = acos(-1);
const db ERR = 1e-10;
#define szz(x) (int)(x).size()
#define rep(i, n) for(int i=0;i<n;i++)
#define Se second
#define Fi first

vector <int> conn[5050];
vector <int> son[5050];
int sz[5050];
bool dchk[5050];
void DFS(int n) {
	dchk[n] = true;
	sz[n] = 1;
	for (auto it : conn[n]) {
		if (dchk[it]) continue;
		son[n].push_back(it);
		DFS(it);
		sz[n] += sz[it];
	}
}

ll C[5050][5050];
ll F[5050];

ll dp[5050];
ll tdp[5050];
int getans(vector<int> Vl) {
	int s = 0, i, j, k;
	for (i = 0; i <= 5000; i++) dp[i] = 0;
	dp[0] = 1;
	for (auto it : Vl) {
		for (i = 0; i <= s + it; i++) tdp[i] = 0;
		for (i = 0; i <= s; i++) {
			for (j = 0; j <= it; j++) {
				ll v = C[it][j] * C[it][j] % MOD;
				v = (v * F[j]) % MOD;
				tdp[i + j] += dp[i] * v % MOD;
			}
		}
		for (i = 0; i <= s + it; i++) dp[i] = tdp[i] % MOD;
		s += it;
	}

	ll rv = 0;
	for (i = 0; i <= s; i++) {
		ll v = dp[i];
		v = (v * F[s-i]) % MOD;
		if (i % 2 == 0) rv = (rv + v) % MOD;
		else rv = (rv - v + MOD) % MOD;
	}
	return (int)rv;
}
int main() {
	int N, i, j;

	F[0] = 1;
	for (i = 1; i <= 5000; i++) F[i] = F[i - 1] * i % MOD;
	for (i = 0; i <= 5000; i++) {
		C[i][0] = C[i][i] = 1;
		for (j = 1; j < i; j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;
	}

	scanf("%d", &N);
	for (i = 1; i < N; i++) {
		int t1, t2;
		scanf("%d %d", &t1, &t2);
		conn[t1].push_back(t2);
		conn[t2].push_back(t1);
	}
	DFS(1);

	int r = 1;
	while (1) {
		if (son[r].empty()) break;
		int mx = 0;
		for (i = 1; i < son[r].size(); i++) if (sz[son[r][mx]] < sz[son[r][i]]) mx = i;
		if (sz[son[r][mx]] * 2 <= N) break;
		r = son[r][mx];
	}
	for (i = 1; i <= N; i++) son[i].clear(), sz[i] = 0, dchk[i] = false;
	DFS(r);

	vector <int> Vu;
	for (auto it : son[r]) Vu.push_back(sz[it]);
	
	int ans = getans(Vu);
	Vu.push_back(1);
	ans = (ans + getans(Vu)) % MOD;
	return !printf("%d\n", ans);
}
### Prompt

Develop a solution in cpp to the problem described below:

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 <stdio.h>
#include <algorithm>
#include <assert.h>
#include <bitset>
#include <cmath>
#include <complex>
#include <deque>
#include <functional>
#include <iostream>
#include <limits.h>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stdlib.h>
#include <string.h>
#include <string>
#include <time.h>
#include <unordered_map>
#include <unordered_set>
#include <vector>

#pragma warning(disable:4996)
#pragma comment(linker, "/STACK:336777216")
using namespace std;

#define mp make_pair
#define all(x) (x).begin(), (x).end()
#define ldb ldouble

typedef tuple<int, int, int> t3;
typedef long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ldb;
typedef pair <int, int> pii;
typedef pair <ll, ll> pll;
typedef pair <ll, int> pli;
typedef pair <db, db> pdd;

int IT_MAX = 1 << 18;
const ll MOD = 1000000007;
const int INF = 0x3f3f3f3f;
const ll LL_INF = 0x3f3f3f3f3f3f3f3f;
const db PI = acos(-1);
const db ERR = 1e-10;
#define szz(x) (int)(x).size()
#define rep(i, n) for(int i=0;i<n;i++)
#define Se second
#define Fi first

vector <int> conn[5050];
vector <int> son[5050];
int sz[5050];
bool dchk[5050];
void DFS(int n) {
	dchk[n] = true;
	sz[n] = 1;
	for (auto it : conn[n]) {
		if (dchk[it]) continue;
		son[n].push_back(it);
		DFS(it);
		sz[n] += sz[it];
	}
}

ll C[5050][5050];
ll F[5050];

ll dp[5050];
ll tdp[5050];
int getans(vector<int> Vl) {
	int s = 0, i, j, k;
	for (i = 0; i <= 5000; i++) dp[i] = 0;
	dp[0] = 1;
	for (auto it : Vl) {
		for (i = 0; i <= s + it; i++) tdp[i] = 0;
		for (i = 0; i <= s; i++) {
			for (j = 0; j <= it; j++) {
				ll v = C[it][j] * C[it][j] % MOD;
				v = (v * F[j]) % MOD;
				tdp[i + j] += dp[i] * v % MOD;
			}
		}
		for (i = 0; i <= s + it; i++) dp[i] = tdp[i] % MOD;
		s += it;
	}

	ll rv = 0;
	for (i = 0; i <= s; i++) {
		ll v = dp[i];
		v = (v * F[s-i]) % MOD;
		if (i % 2 == 0) rv = (rv + v) % MOD;
		else rv = (rv - v + MOD) % MOD;
	}
	return (int)rv;
}
int main() {
	int N, i, j;

	F[0] = 1;
	for (i = 1; i <= 5000; i++) F[i] = F[i - 1] * i % MOD;
	for (i = 0; i <= 5000; i++) {
		C[i][0] = C[i][i] = 1;
		for (j = 1; j < i; j++) C[i][j] = (C[i - 1][j - 1] + C[i - 1][j]) % MOD;
	}

	scanf("%d", &N);
	for (i = 1; i < N; i++) {
		int t1, t2;
		scanf("%d %d", &t1, &t2);
		conn[t1].push_back(t2);
		conn[t2].push_back(t1);
	}
	DFS(1);

	int r = 1;
	while (1) {
		if (son[r].empty()) break;
		int mx = 0;
		for (i = 1; i < son[r].size(); i++) if (sz[son[r][mx]] < sz[son[r][i]]) mx = i;
		if (sz[son[r][mx]] * 2 <= N) break;
		r = son[r][mx];
	}
	for (i = 1; i <= N; i++) son[i].clear(), sz[i] = 0, dchk[i] = false;
	DFS(r);

	vector <int> Vu;
	for (auto it : son[r]) Vu.push_back(sz[it]);
	
	int ans = getans(Vu);
	Vu.push_back(1);
	ans = (ans + getans(Vu)) % MOD;
	return !printf("%d\n", ans);
}
```