#include <bits/stdc++.h>
using namespace std;
struct data {
  int len, num[60];
  data() {
    memset(num, 0, sizeof(num));
    len = 1;
  }
} dp[710][710];
int n, o1, o2, sz[710];
vector<int> edge[710];
data mul1(data o1, data o2) {
  data ans;
  for (int i = 1; i <= o1.len; i++)
    for (int j = 1; j <= o2.len; j++) {
      ans.num[i + j - 1] += o1.num[i] * o2.num[j];
      ans.num[i + j] += ans.num[i + j - 1] / (10000);
      ans.num[i + j - 1] %= (10000);
    }
  ans.len = o1.len + o2.len;
  if (!ans.num[ans.len]) --ans.len;
  return ans;
}
data mul2(data o1, int x) {
  data ans;
  for (int i = 1; i <= o1.len; i++) {
    ans.num[i] += x * o1.num[i];
    ans.num[i + 1] += ans.num[i] / (10000);
    ans.num[i] %= (10000);
  }
  ans.len = o1.len;
  if (ans.num[ans.len + 1]) ++ans.len;
  return ans;
}
data Max(data o1, data o2) {
  if (o1.len != o2.len) return o1.len > o2.len ? o1 : o2;
  for (int i = o1.len; i >= 1; i--)
    if (o1.num[i] != o2.num[i]) return o1.num[i] > o2.num[i] ? o1 : o2;
  return o1;
}
void dfs(int x, int f) {
  sz[x] = 1;
  for (int i = 0; i <= n; i++) dp[x][i].num[1] = 1;
  for (int i = 0; i < edge[x].size(); i++) {
    int y = edge[x][i];
    if (y == f) continue;
    dfs(y, x);
    for (int j = sz[x]; j >= 0; j--) {
      for (int k = sz[y]; k >= 0; k--) {
        dp[x][j + k] = Max(dp[x][j + k], mul1(dp[x][j], dp[y][k]));
      }
    }
    sz[x] += sz[y];
  }
  for (int i = 1; i <= sz[x]; i++) dp[x][0] = Max(dp[x][0], mul2(dp[x][i], i));
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; i++) {
    scanf("%d%d", &o1, &o2);
    edge[o1].push_back(o2);
    edge[o2].push_back(o1);
  }
  dfs(1, 0);
  for (int i = dp[1][0].len; i >= 1; i--) {
    if (i == dp[1][0].len)
      printf("%d", dp[1][0].num[i]);
    else
      printf("%04d", dp[1][0].num[i]);
  }
}
