#include <iostream>
#include<stack>
#include<vector>
#include<algorithm>
#define max 100007
using namespace std;
int node1,Distance;
void dfs(vector<int>vec[],int node,int start)
{
int dist[node+1],par[node+1],vis[node+1];
for(int i=0;i<node+1;i++)
dist[i]=0,par[i]=0,vis[i]=0;
stack<int>trav;
trav.push(start);
// for(int i=0;i<vec[1].size();i++)
// cout<<vec[1][i]<<" ";
while(!trav.empty())
{
int u=trav.top();
//cout<<u<<" ";
trav.pop();
{
if(!vis[u])
{
dist[u]=dist[par[u]]+1;//for storing distances from parent
dist[start]=0;
vis[u]++;
for(int i=0;i<vec[u].size();i++)
{
int c=vec[u][i];
trav.push(c);
if(!vis[c])
par[c]=u;//storing the parent
}
}
}
}
// for(int i=1;i<node+1;i++)
// cout<<dist[i]<<" ";
// cout<<endl;
node1=distance(dist,max_element(dist,dist+(node+1)));//finding the node with largest distance
// cout<<node1<<" ";
Distance=dist[node1];//finding the max dist
// cout<<Distance<<" ";
}
int main() {
long long int n;
cin>>n;
vector<int>vec[n+1];
for(int i=0;i<n+1;i++)
{
int u,v;
cin>>u>>v;
//cout<<u<<" "<<v;
//cout<<endl;
vec[u].push_back(v);
vec[v].push_back(u);
}
dfs(vec,n,1);
dfs(vec,n,node1);
cout<<Distance<<endl;
// your code here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZTxzdGFjaz4KI2luY2x1ZGU8dmVjdG9yPgojaW5jbHVkZTxhbGdvcml0aG0+CiNkZWZpbmUgbWF4IDEwMDAwNwp1c2luZyBuYW1lc3BhY2Ugc3RkOwppbnQgbm9kZTEsRGlzdGFuY2U7CnZvaWQgZGZzKHZlY3RvcjxpbnQ+dmVjW10saW50IG5vZGUsaW50IHN0YXJ0KQp7CglpbnQgZGlzdFtub2RlKzFdLHBhcltub2RlKzFdLHZpc1tub2RlKzFdOwoJZm9yKGludCBpPTA7aTxub2RlKzE7aSsrKQoJZGlzdFtpXT0wLHBhcltpXT0wLHZpc1tpXT0wOwoJc3RhY2s8aW50PnRyYXY7Cgl0cmF2LnB1c2goc3RhcnQpOwovLwlmb3IoaW50IGk9MDtpPHZlY1sxXS5zaXplKCk7aSsrKQovLwljb3V0PDx2ZWNbMV1baV08PCIgIjsKCXdoaWxlKCF0cmF2LmVtcHR5KCkpCgl7CgkJaW50IHU9dHJhdi50b3AoKTsKCQkvL2NvdXQ8PHU8PCIgICI7CgkJdHJhdi5wb3AoKTsKCQl7CgkJCWlmKCF2aXNbdV0pCgkJCXsKCQkJCWRpc3RbdV09ZGlzdFtwYXJbdV1dKzE7Ly9mb3Igc3RvcmluZyBkaXN0YW5jZXMgZnJvbSBwYXJlbnQKCQkJCWRpc3Rbc3RhcnRdPTA7CgkJCQl2aXNbdV0rKzsKCQkJCWZvcihpbnQgaT0wO2k8dmVjW3VdLnNpemUoKTtpKyspCgkJCQl7CgkJCQkJaW50IGM9dmVjW3VdW2ldOwoJCQkJCXRyYXYucHVzaChjKTsKCQkJCQlpZighdmlzW2NdKQoJCQkJCXBhcltjXT11Oy8vc3RvcmluZyB0aGUgcGFyZW50CgkJCQl9CgkJCX0KCQl9CgkJCgl9Ci8vCWZvcihpbnQgaT0xO2k8bm9kZSsxO2krKykKLy8JY291dDw8ZGlzdFtpXTw8IiAiOwovLwljb3V0PDxlbmRsOwoJbm9kZTE9ZGlzdGFuY2UoZGlzdCxtYXhfZWxlbWVudChkaXN0LGRpc3QrKG5vZGUrMSkpKTsvL2ZpbmRpbmcgdGhlIG5vZGUgd2l0aCBsYXJnZXN0IGRpc3RhbmNlCi8vCWNvdXQ8PG5vZGUxPDwiICI7CglEaXN0YW5jZT1kaXN0W25vZGUxXTsvL2ZpbmRpbmcgdGhlIG1heCBkaXN0Ci8vCWNvdXQ8PERpc3RhbmNlPDwiICI7Cn0KaW50IG1haW4oKSB7Cglsb25nIGxvbmcgaW50IG47CgljaW4+Pm47Cgl2ZWN0b3I8aW50PnZlY1tuKzFdOwoJZm9yKGludCBpPTA7aTxuKzE7aSsrKQoJewoJCWludCB1LHY7CgkJY2luPj51Pj52OwoJCS8vY291dDw8dTw8IiAiPDx2OwoJCS8vY291dDw8ZW5kbDsKCQl2ZWNbdV0ucHVzaF9iYWNrKHYpOwoJCXZlY1t2XS5wdXNoX2JhY2sodSk7Cgl9CglkZnModmVjLG4sMSk7CglkZnModmVjLG4sbm9kZTEpOwoJY291dDw8RGlzdGFuY2U8PGVuZGw7CgkvLyB5b3VyIGNvZGUgaGVyZQoKCXJldHVybiAwOwp9