#include <bits/stdc++.h>
using namespace std;

vector<int> stablo[100005];
int tezine[100005];
// V - 1   X - 2   P - 0
int oznaka[100005];
int daljina[100005];
int najveci = -1;
int ime_najveceg = -1;
int pamcivac_oznake = 0;
vector<int> jedinicni;
void povezi(int u, int v)
{
    stablo[u].push_back(v);
    stablo[v].push_back(u);
    tezine[u] += 1;
    tezine[v] += 1;
    if (najveci < tezine[u])
    {
        najveci = tezine[u];
        ime_najveceg = u;
    }
    if (najveci < tezine[v])
    {
        najveci = tezine[v];
        ime_najveceg = v;
    }
}
int najteze()
{
    return ime_najveceg;
}
int kolikoTezi(int u)
{
    return tezine[u];
}
bool comp (const int & a, const int & b) {
    return daljina[a] < daljina[b];
}

int jak_bfs(int root, int n)
{
    queue<int> q;
    q.push(root);
    bool vis[n] = {0};
    int jaka_daljina[n];
    vis[root] = true;
    jaka_daljina[root] = 0;
    int najveca_daljina = -1;
    int current;
    while (! q.empty() )
    {
        current = q.front();
        if (oznaka[current] == 1)
            najveca_daljina = max(najveca_daljina, jaka_daljina[current]);
        q.pop();

        for (int x : stablo[current]) {
            if (!vis[x]) {
                q.push(x);
                jaka_daljina[x] = jaka_daljina[current] + 1;
                vis[x] = true;
            }
        }
    }
    return najveca_daljina;
}

int bfs(int root, int n)
{
    queue<int> q;
    q.push(root);
    daljina[root] = 0;
    int current = root;
    oznaka[current] = 1;
    pamcivac_oznake++;
    pamcivac_oznake %= 2;
    while ( ! q.empty() )
    {
        current = q.front();
        q.pop();

        for (int x : stablo[current]) {
            if (!oznaka[x]) {
                daljina[x] = daljina[current] + 1;
                if (kolikoTezi(x) != 1) {
                     q.push(x);
                     oznaka[x] = pamcivac_oznake + 1;
                     pamcivac_oznake++;
                     pamcivac_oznake %= 2;
                }
                else
                     jedinicni.push_back(x);
            }
        }
    }
    sort(jedinicni.begin(), jedinicni.end(), comp);
    int maksimalni = -1;
    for (int i = 0; i < jedinicni.size(); i++)
    {
        oznaka[jedinicni[i]] = pamcivac_oznake + 1;
        if (oznaka[jedinicni[i]] == 1) {
            maksimalni = max(maksimalni, jak_bfs(jedinicni[i], n));
        }
        pamcivac_oznake++;
        pamcivac_oznake %= 2;
    }
    return maksimalni;
}
int main() {

    ios_base::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int n;
    cin >> n;
    int u, v;
    for (int i = 0; i < n-1; i++)
    {
        cin >> u >> v;
        povezi(u, v);
    }
    cout << bfs(najteze(), n) << "\n";
    return 0;
}