#include <bits/stdc++.h>
#include <iomanip>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
#define ordered_set tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update>
using namespace std;
#define ll long long
#define pb push_back
#define all(a) a.begin(),a.end()
#define death ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
////////////////////////////////////global variables//////////////////////////////////////////////////
map<int ,vector<int>> adj;
map<int, bool> vis;
map<int, int> level;
int farLeaf,farlevel;
int maxdis=-1;
////////////////////////////////////recursion/////////////////////////////////////////////////////////
/////////////////////////////////////functions///////////////////////////////////////////////////////
bool isLeaf(int node) {
return adj[node].size() == 1;
}
void dfs(ll num,int dis){
//*if (isLeaf(num) && num != 1) return 1;*//*
if(isLeaf(num)) {
if (maxdis < dis) {
maxdis = dis;
farLeaf=num;
farlevel=level[num];
}
}
vis[num] = true;
for (int i = 0; i < adj[num].size(); i++) {
int ch = adj[num][i];
if (!vis[ch]) {
dfs(ch,dis+1);
level[ch] = level[num] + 1;
}
}
}
/////////////////////////////////////////////////////////////////////////////////////////////////////
void neverland() {
int n; cin>>n;
vis.clear();
for (int i=1;i<n;i++)
{
int x,y;
cin>>x>>y;
adj[x].pb(y);
adj[y].pb(x);
}
dfs(1,0);
int far=maxdis;
vis.clear();
dfs(far,0);
cout<<maxdis<<endl;
}
int main() {
death;
long long t=1;
// cin>>t;
while(t--){
neverland();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNpbmNsdWRlIDxpb21hbmlwPgojaW5jbHVkZSA8ZXh0L3BiX2RzL2Fzc29jX2NvbnRhaW5lci5ocHA+CiNpbmNsdWRlIDxleHQvcGJfZHMvdHJlZV9wb2xpY3kuaHBwPgp1c2luZyBuYW1lc3BhY2UgX19nbnVfcGJkczsKI2RlZmluZSBvcmRlcmVkX3NldCB0cmVlPGludCwgbnVsbF90eXBlLCBsZXNzPGludD4sIHJiX3RyZWVfdGFnLCB0cmVlX29yZGVyX3N0YXRpc3RpY3Nfbm9kZV91cGRhdGU+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CiNkZWZpbmUgbGwgbG9uZyBsb25nCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgYWxsKGEpICBhLmJlZ2luKCksYS5lbmQoKQojZGVmaW5lIGRlYXRoIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oMCk7Y2luLnRpZSgwKTtjb3V0LnRpZSgwKTsKCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vL2dsb2JhbCB2YXJpYWJsZXMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLwptYXA8aW50ICx2ZWN0b3I8aW50Pj4gYWRqOwptYXA8aW50LCBib29sPiB2aXM7Cm1hcDxpbnQsIGludD4gbGV2ZWw7CmludCBmYXJMZWFmLGZhcmxldmVsOwppbnQgbWF4ZGlzPS0xOwovLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9yZWN1cnNpb24vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KCi8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy9mdW5jdGlvbnMvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCmJvb2wgaXNMZWFmKGludCBub2RlKSB7CiAgICByZXR1cm4gYWRqW25vZGVdLnNpemUoKSA9PSAxOwp9CnZvaWQgZGZzKGxsIG51bSxpbnQgZGlzKXsKICAgIC8vKmlmIChpc0xlYWYobnVtKSAmJiBudW0gIT0gMSkgcmV0dXJuIDE7Ki8vKgogICAgaWYoaXNMZWFmKG51bSkpIHsKICAgICAgICBpZiAobWF4ZGlzIDwgZGlzKSB7CiAgICAgICAgICAgIG1heGRpcyA9IGRpczsKICAgICAgICAgICAgZmFyTGVhZj1udW07CiAgICAgICAgICAgIGZhcmxldmVsPWxldmVsW251bV07CiAgICAgICAgfQogICAgfQogICAgdmlzW251bV0gPSB0cnVlOwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZGpbbnVtXS5zaXplKCk7IGkrKykgewogICAgICAgIGludCBjaCA9IGFkaltudW1dW2ldOwogICAgICAgIGlmICghdmlzW2NoXSkgewogICAgICAgICAgICBkZnMoY2gsZGlzKzEpOwogICAgICAgICAgICBsZXZlbFtjaF0gPSBsZXZlbFtudW1dICsgMTsKICAgICAgICB9CiAgICB9Cgp9Ci8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vCgp2b2lkIG5ldmVybGFuZCgpIHsKICAgIGludCBuOyBjaW4+Pm47CiAgICB2aXMuY2xlYXIoKTsKCiAgICBmb3IgKGludCBpPTE7aTxuO2krKykKICAgIHsKICAgICAgICBpbnQgeCx5OwogICAgICAgIGNpbj4+eD4+eTsKICAgICAgICBhZGpbeF0ucGIoeSk7CiAgICAgICAgYWRqW3ldLnBiKHgpOwogICAgfQogICAgZGZzKDEsMCk7CiAgICBpbnQgZmFyPW1heGRpczsKICAgIHZpcy5jbGVhcigpOwogICAgZGZzKGZhciwwKTsKICAgIGNvdXQ8PG1heGRpczw8ZW5kbDsKfQppbnQgbWFpbigpIHsKICAgIGRlYXRoOwogICAgbG9uZyBsb25nIHQ9MTsKICAgIC8vIGNpbj4+dDsKICAgIHdoaWxlKHQtLSl7CiAgICAgICAgbmV2ZXJsYW5kKCk7CiAgICB9Cn0=