#include<iostream>
#include<vector>
#include<queue>
#include<fstream>
using namespace std;
ifstream f("darb.in");
ofstream g("darb.out");
queue <int> q;
vector <int> g[100001];
int sol[100001];
bool v[100001];
void BFS(int x,bool b,queue <int> &bfs)
{
int z,i;
v[x]=true;
bfs.push(x);
q.push(x);
while(!q.empty())
{
z = q.front();
q.pop();
for(i=0;i<g[z].size();i++)
{
if(!v[g[z][i]])
{
bfs.push(g[z][i]);
q.push(g[z][i]);
v[g[z][i]] = true;
if(b)
sol[g[z][i]] = sol[z] + 1;
}
}
}
}
int main()
{
int n;
int a,b;
int i;
fstream f("darb.in",ios::in);
f>>n;
while(f>>a>>b)
{
g[a].push_back(b);
g[b].push_back(a);
}
queue <int> bfs1,bfs2;
BFS(1,false,bfs1);
int x;
x = bfs1.back();
for(i=1;i<=n;i++)
v[i] = false;
BFS(x,true,bfs2);
int maxim = 0;
for(int i=1;i<=n;i++)
if(sol[i]>maxim)
maxim=sol[i];
maxim=maxim+1;
g<<maxim;
}