//好像套一个树形dp就过了
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N = 1e6 + 5 ;
int ans = 0 ;
vector<int >G[N];
void add(int u,int v){
G[u].push_back(v) ;
G[v].push_back(u) ;
}
int dfs_dp(int u,int f){
int max1 = 0 ;
int max2 = 0 ;
for(int v : G[u]){
if(v == f) continue ;
int dis = dfs_dp(v,u) + 1; // 子节点v向下延申的最长距离 + 1 = 子节点u向下延申的最长距离
if(dis > max1){
max2 = max1 ;
max1 = dis ;
}
else if(dis > max2){
max2 = dis ;
}
}
ans = max(ans, max1 + max2);
return max1 ;
}
signed main(){
ios::sync_with_stdio(false),cin.tie(nullptr) ;
int n ;
cin >> n ;
for(int i = 1;i < n;i++){
int u,v ;
cin >> u >> v ;
add(u,v) ;
}
dfs_dp(1,0) ;
cout << ans + 1<< "\n" ;
return 0 ;
}