OI XXIII - prd

// https://szkopul.edu.pl/problemset/problem/1QaUWE_ePAmitZjgAszOVD1U/site/?key=statement

#include <bits/stdc++.h>

using namespace std;
#define int long long

constexpr int sizik = 1000 * 1001;

#define ar std::array
#define pr std::pair
#define vec std::vector

typedef long long ll;
typedef vec<vec<int>> _kra;

std::vector<int> kra[sizik];
int dp[sizik], dp2[sizik];

void DFS(int v, int p) {
    std::vector<int> local;

    for (const auto& u : kra[v]) {
        if (u != p) {
            DFS(u, v);
            local.push_back(dp[u]);
        }
    }

    std::sort(local.begin(), local.end(), std::greater<int>());

    dp[v] = std::max(0ll, (int)kra[v].size() - 1);

    int sum = kra[v].size(), m = kra[v].size();
    if (p != v) m--;
    if (local.size() > 0) {
        sum += local[0];
        dp[v] = std::max(dp[v], local[0] + m - 1);
        dp2[v] = std::max(dp2[v], sum - 1);
    }
    if (local.size() > 1) {
        sum += local[1];
        dp2[v] = std::max(dp2[v], sum - 2);
    }
}

void solve() {
    int n;
    std::cin >> n;

    for (int i = 0; i < n - 1; i++) {
        int a, b;
        std::cin >> a >> b;

        kra[a].push_back(b);
        kra[b].push_back(a);
    }

    DFS(1, 1);

    int ans = 0;

    for (int i = 1; i <= n; i++) {
        ans = std::max(dp2[i], ans);
    }

    std::cout << ans << '\n';
}

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

    int t = 1;

    for (; t > 0; t--) {
        solve();
    }

    return 0;
}