#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e15;
const int maxn = 3005;
long long fa[maxn][maxn], sub[maxn][maxn], dp[maxn][maxn];
vector<int> e[maxn];
int vis[maxn][maxn];
int dfs(int now, int u, int ffa) {
  int d = e[u].size();
  for (int i = (0); i <= (d - 1); i++) {
    int v = e[u][i];
    if (v != ffa) sub[now][u] += dfs(now, v, fa[now][v] = u);
  }
  return sub[now][u];
}
long long getdp(int u, int v) {
  vis[u][v] = 1;
  long long d1 = vis[fa[v][u]][v] ? dp[fa[v][u]][v] : getdp(fa[v][u], v);
  long long d2 = vis[fa[u][v]][u] ? dp[fa[u][v]][u] : getdp(fa[u][v], u);
  return dp[u][v] = sub[u][v] * sub[v][u] + max(d1, d2);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  long long n, ans = 0;
  cin >> n;
  memset(vis, 0, sizeof(vis));
  for (int i = (1); i <= (n - 1); i++) {
    int a, b;
    cin >> a >> b;
    e[a].push_back(b);
    e[b].push_back(a);
  }
  for (int i = (1); i <= (n); i++)
    for (int j = (1); j <= (n); j++) sub[i][j] = 1;
  for (int i = (1); i <= (n); i++) {
    fa[i][i] = -1;
    vis[i][i] = 1;
    dp[i][i] = 0;
    dfs(i, i, -1);
  }
  for (int i = (1); i <= (n); i++) {
    for (int j = (1); j <= (n); j++) {
      if (vis[i][j]) continue;
      ans = max(getdp(i, j), ans);
    }
  }
  cout << ans << endl;
  return 0;
}
