#include <bits/stdc++.h>
using namespace std;
struct Path {
  int u, v, size;
};
const int MAXV = 3e3;
int n, root;
bool visited[MAXV];
long long int dp[MAXV][MAXV];
vector<Path> order;
int par[MAXV][MAXV];
int size[MAXV][MAXV];
vector<int> N[MAXV];
bool used[MAXV][MAXV];
void read();
void init();
void setVisited();
void setParents();
void dfs(int, int);
bool compare(const Path&, const Path&);
void test();
void fillDP();
long long int getMax();
int main() {
  read();
  init();
  fillDP();
  cout << getMax() << endl;
  return 0;
}
void read() {
  ios_base ::sync_with_stdio(false);
  cin.tie(0);
  cin >> n;
  for (int e = 1; e < n; e++) {
    int u, v;
    cin >> u >> v;
    u--;
    v--;
    N[u].push_back(v);
    N[v].push_back(u);
  }
}
void init() {
  for (int v = 0; v < n; v++) {
    root = v;
    setVisited();
    setParents();
    dfs(v, 0);
  }
  sort(order.begin(), order.end(), compare);
}
void setVisited() {
  for (int v = 0; v < n; v++) visited[v] = false;
}
void setParents() {
  for (int v = 0; v < n; v++) par[root][v] = -1;
}
void dfs(int v, int d) {
  visited[v] = true;
  for (int i = 0; i < N[v].size(); i++) {
    int u = N[v][i];
    if (!visited[u]) {
      dfs(u, d + 1);
      par[root][u] = v;
      size[root][v] += size[root][u];
    }
  }
  size[root][v]++;
  if (!used[root][v]) {
    Path path;
    path.u = root;
    path.v = v;
    path.size = d;
    order.push_back(path);
    used[root][v] = used[v][root] = true;
  }
}
bool compare(const Path& a, const Path& b) { return (a.size < b.size); }
void test() {
  for (int i = 0; i < order.size(); i++)
    cerr << '(' << order[i].u + 1 << " , " << order[i].v + 1 << ')' << endl;
}
void fillDP() {
  for (int i = 0; i < order.size(); i++) {
    int u = order[i].u;
    int v = order[i].v;
    if (u == v) continue;
    int number = order[i].size - 1;
    int p = par[v][u];
    int q = par[u][v];
    dp[u][v] = max(dp[p][v], dp[q][u]) + size[u][v] * size[v][u];
    dp[v][u] = dp[u][v];
  }
}
long long int getMax() {
  long long int ans = -1;
  for (int u = 0; u < n; u++)
    for (int v = 0; v < n; v++) ans = max(ans, dp[u][v]);
  return ans;
}
