vector <vector > adj; int visit[N] = {0}; int dist[N] = {0}; int lf; void dfs1(int u, int d) { visit[u] = 1; dist[u] = d;
if (dist[u] > dist[lf])
lf = u;
for (int i = 0; i < (int)adj[u].size(); ++i) {
int e = adj[u][i];
if (visit[e] == 0)
dfs1(e, d + 1);
}
} void dfs(int start, int d) { visit[start] = 2; dist[start] = d; for (int i = 0; i < (int)adj[start].size(); ++i) { int t = adj[start][i]; if (visit[t] < 2) { dfs(t, d + 1); } } }
void solve() { int n, m, f; cin >> n; m = n — 1; adj = vector <vector > (n); for (int i = 0; i < m; ++i) { int u, v; scanf("%d%d", &u, &v); --u; --v; adj[u].push_back(v); adj[v].push_back(u); }
memset(dist, 0, sizeof dist);
int ans = 0;
for (int i = 0; i < n; ++i) {
if (visit[i] > 0)
continue;
lf = i;
dfs1(i, 0);
dfs(lf, 0);
}
for (int i = 0; i < n; ++i) {
ans = max (ans, dist[i]);
}
// cout << ans << " ";
printf ("%d", ans);
}