#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
typedef long long llong;
const int MAXN = 5e5 + 10;
struct Path
{
int len;
int cnt;
Path(){};
Path(int len, int cnt)
{
this->len = len;
this->cnt = cnt;
}
inline friend bool operator<(const Path& p1, const Path& p2)
{
if(p1.len != p2.len)
return p1.len > p2.len;
return p1.cnt > p2.cnt;
}
};
int n;
vector < int > adj[MAXN];
int farth[MAXN][2];
int cnt[MAXN][2];
pair < llong, llong > opt[MAXN];
void read()
{
cin >> n;
for(int i = 1; i < n; i++)
{
int u, v;
cin >> u >> v;
adj[u].push_back(v);
adj[v].push_back(u);
}
}
void dfs1(int u, int p)
{
farth[u][0] = 0;
cnt[u][0] = 1;
for(int& v : adj[u])
{
if(v == p)
continue;
dfs1(v, u);
if(farth[u][0] < farth[v][0] + 1)
{
farth[u][0] = farth[v][0] + 1;
cnt[u][0] = cnt[v][0];
}
else if(farth[u][0] == farth[v][0] + 1)
{
cnt[u][0] += cnt[v][0];
}
}
}
void dfs2(int u, int p)
{
vector < Path > paths;
for(int& v : adj[u])
{
if(v == p)
continue;
paths.push_back(Path(farth[v][0] + 1, cnt[v][0]));
}
paths.push_back(Path(farth[u][1], cnt[u][1]));
sort(paths.begin(), paths.end());
if(adj[u].size() >= 3)
{
Path p1 = paths[0];
Path p2 = paths[1];
Path p3 = paths[2];
opt[u].first = 1LL * p1.len * (p2.len + p3.len);
llong sum = 0;
llong sum2 = 0;
for(Path& pt : paths)
{
if(pt.len == p3.len)
{
sum += pt.cnt;
sum2 += (1LL * pt.cnt * pt.cnt);
}
}
if(p1.len != p2.len && p2.len != p3.len)
{
opt[u].second = 1LL * p2.cnt * sum;
}
else if(p1.len == p2.len && p2.len == p3.len)
{
opt[u].second = (1LL * sum * sum - sum2) / 2LL;
}
else if(p1.len == p2.len)
{
opt[u].second = 1LL * p1.cnt * sum + 1LL * p2.cnt * sum;
}
else if(p2.len == p3.len)
{
opt[u].second = (1LL * sum * sum - sum2) / 2LL;
}
}
for(int& v : adj[u])
{
}
}
int main()
{
return 0;
}