//好像套一个树形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 ;
}