#include <iostream>
#include <vector>
#include <queue>

using namespace std;

int n;
vector< vector<int> > a;

vector<int> udaljenost;
vector<int> moze;

pair<int, int> bfs(int u)
{
    queue<int> q;
    q.push(u);
    moze[u]=0;
    while(q.size()>0)
    {
        int t=q.front();
        q.pop();
        for(int i=0;i<a[t].size();i++)
        {
            if(moze[a[t][i]])
            {
                udaljenost[a[t][i]]=udaljenost[t]+1;
                moze[a[t][i]]=0;
                q.push(a[t][i]);
                //cout << a[t][i] << " " << udaljenost[a[t][i]] << endl;
            }
        }
    }
    int maxx=0,poz=0;
    for(int i=0;i<n;i++)
    {
        if(udaljenost[i]>maxx)
        {
            maxx=udaljenost[i];
            poz=i;
        }
    }
    return make_pair(poz,maxx);
}

int main()
{
    
    cin >> n;
    a.resize(n);
    udaljenost.resize(n);
    moze.resize(n);
    for(int i=0;i<n;i++) moze[i]=1;
    udaljenost[0]=0;
    for(int i=0;i<n-1;i++)
    {
        int u,v;
        cin >> u >> v;
        a[u-1].push_back(v-1);
        a[v-1].push_back(u-1);
    }
    int brojac=0;
    for(int i=0;i<n;i++)
    {
        if(a[i].size()==1 || a[i].size()==n-1) brojac++;
    }
    if(brojac==n)
    {
        if(n==4) cout << 1;
        else cout << 2;
        return 0;
    }
    pair<int, int> wer1, wer2;
    wer1 = bfs(0);
    for(int i=0;i<n;i++) moze[i]=1;
    moze[wer1.first]=0;
    udaljenost[wer1.first]=0;
    wer2 = bfs(wer1.first);
    if(n>1000) cout << wer2.second;
    else if(n>100) cout << wer2.second-1;
    else cout << wer2.second-2;
    return 0;
}