#include <bits/stdc++.h>
using namespace std;
const long long base = 100000000;
int n;
int first[705], num;
struct Big_Int {
  int len;
  long long Num[30];
  Big_Int operator*(const Big_Int x) const {
    Big_Int temp;
    temp.len = len + x.len - 1;
    memset(temp.Num, 0, sizeof temp.Num);
    for (int i = 1; i <= len; i++)
      for (int j = 1; j <= x.len; j++) {
        temp.Num[i + j - 1] += Num[i] * x.Num[j];
        temp.Num[i + j] += temp.Num[i + j - 1] / base;
        temp.Num[i + j - 1] %= base;
      }
    if (temp.Num[temp.len + 1]) temp.len++;
    return temp;
  }
  bool operator<(const Big_Int x) const {
    if (len != x.len) return len < x.len;
    for (int i = len; i >= 1; i--)
      if (Num[i] != x.Num[i]) return Num[i] < x.Num[i];
    return false;
  }
} dp[705][705];
struct Edge {
  int v, nxt;
} edge[705 << 1];
void Add_Edge(int u, int v) {
  num++;
  edge[num].v = v;
  edge[num].nxt = first[u];
  first[u] = num;
}
int sz[705];
void dfs(int u, int fa) {
  sz[u] = 1;
  dp[u][1].len = 1, dp[u][1].Num[1] = 1;
  dp[u][0].len = 1, dp[u][0].Num[1] = 0;
  for (int k = first[u]; k; k = edge[k].nxt) {
    Edge& e = edge[k];
    if (e.v == fa) continue;
    dfs(e.v, u);
    for (int i = sz[u]; i >= 0; i--)
      for (int j = sz[e.v]; j >= 0; j--)
        dp[u][i + j] = max(dp[u][i + j], dp[u][i] * dp[e.v][j]);
    sz[u] += sz[e.v];
  }
  Big_Int temp;
  temp.len = 1;
  temp.Num[1] = 0;
  for (int i = 1; i <= sz[u]; i++) {
    temp.Num[1]++;
    dp[u][0] = max(dp[u][0], dp[u][i] * temp);
  }
}
int main() {
  scanf("%d", &n);
  for (int i = 1; i <= n - 1; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    Add_Edge(u, v);
    Add_Edge(v, u);
  }
  dfs(1, 0);
  printf("%lld", dp[1][0].Num[dp[1][0].len]);
  for (int i = dp[1][0].len - 1; i >= 1; i--) printf("%08lld", dp[1][0].Num[i]);
  return 0;
}
