#include <iostream>
#include <fstream>
#include <vector>
#include <queue>
using namespace std;
vector <vector <long> > graf;
vector <bool> visited;
vector <long> nr;
long n;
void Citire()
{
long x,y;
ifstream f("darb.in");
f>>n;
graf.resize(n);
visited.resize(n,false);
nr.resize(n,0);
while (f>>x>>y)
{
x--;
y--;
graf[x].push_back(y);
graf[y].push_back(x);
}
}
void ResetViz()
{
visited.clear();
visited.empty();
visited.resize(n, false);
}
void BFS(long x, long &capat)
{
long i=0;
nr[x]=0;
vector <long> coada;
coada.push_back(x);
visited[x]=true;
while (i<coada.size())
{
for (long j=0;j<graf[coada[i]].size();j++)
{
if (!visited[graf[coada[i]][j]])
{
nr[graf[coada[i]][j]]=nr[coada[i]]+1;
coada.push_back(graf[coada[i]][j]);
visited[graf[coada[i]][j]]=true;
}
}
capat=coada[i];
i++;
}
ResetViz();
//return dist;
}
/*void BFS(long x, long y, vector <long> &nr )
{
nr.resize(n,0);
nr[x]=0;
long i=0;
vector <long> coada;
coada.push_back(x);
visited[x]=true;
while (i<coada.size())
{
for (long j=0;j<graf[coada[i]].size();j++)
{
if (!visited[graf[coada[i]][j]])
{
if (graf[coada[i]][j]==y)
{
nr[y]=nr[coada[i]]+1;
return;
}
nr[graf[coada[i]][j]]=nr[coada[i]]+1;
coada.push_back(graf[coada[i]][j]);
visited[graf[coada[i]][j]]=true;
}
}
i++;
cout<<endl;
}
ResetViz();
}*/
int main()
{
Citire();
long c1,c2,dist=0;
BFS(0,c1);
cout<<endl;
BFS(c1,c2);
cout<<endl;
ofstream g("darb.out");
g<<nr[c2]<<" ";
g.close();
return 0;
}