Link to this code: https://cses.fi/paste/c3aaf66824c414b1d98675/
/* 777 */
#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 2e5 + 5;
int dep[MAX_N];
vector<int> g[MAX_N];
int N;

// populates depth array of each node from the `src` node
void calcDepth(int u, int par) {
    for (int v : g[u]) {
        if (v == par) continue;
        dep[v] = dep[u] + 1;
        calcDepth(v, u);
    }
}

// returns {height, farthest node} of tree rooted at `src`
pair<int, int> getHeight(int src) {
    calcDepth(src, -1);
    int fn = 1, mxd = 0;  // fn-farthest node, mxd-max depth
    for (int i = 1; i <= N; ++i) {
        if (dep[i] > mxd) {
            mxd = dep[i];
            fn = i;
        }
    }
    return make_pair(mxd, fn);
}

int getDiameter() {
    auto [ht, far] = getHeight(1);  // get the farthest node from any random node
    memset(dep, 0, sizeof(dep));
    auto [diam, _] = getHeight(far);  // max dist from farthest node is diameter
    return diam;
}

void solve() {
    cin >> N;
    for (int i = 0; i < N - 1; ++i) {
        int u, v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    cout << getDiameter();
}

int32_t main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
    solve();
}