#include <bits/stdc++.h>
#define fi first
#define se second
#define all(v) v.begin() , v.end()
#define sz(v) int(v.size())
#define unq(v) sort(all(v)); v.resize(unique(all(v)) - v.begin());
using namespace std;

typedef long long ll;
typedef pair<int , int> ii;
typedef pair<long long , int> lli;

const int maxN = int(2e5)+7;
const int inf = int(1e9)+7;

int n;
vector<int> g[maxN];
int dp[maxN];
bool bad;

void dfs(int u , int par , int k){
    dp[u] = 0;
    for (int v : g[u]){
        if (v != par){
            if (bad) return;
            dfs(v , u , k);
        }
    }
    multiset<int> st;
    for (int v : g[u]){
        if (v != par){
            st.insert(dp[v] + 1);
        }
    }
    if (st.empty()) return;
    while (sz(st) > 2){
        int x = *st.begin(); st.erase(st.begin());
        if (st.lower_bound(k - x) == st.end()){
            dp[u] = x;
            while (st.empty() == 0){
                int y = *st.begin();
                if (y >= k) continue;
                auto it = st.lower_bound(k - y);
                if (it == st.end()){
                    bad = true;
                    return;
                }
                st.erase(it);
            }
            return;
        }
        st.erase(st.lower_bound(k - x));
    }
    if (sz(st) == 1){
        dp[u] = *st.begin();
    }
    else{
        int x = *st.begin(); st.erase(st.begin());
        int y = *st.begin(); st.erase(st.begin());
        if (x + y < k){
            bad = true;
            return;
        }
        if (y >= k){
            dp[u] = x;
        }
        else{
            dp[u] = 0;
        }
    }
}

bool check(int k){
    bad = false;
    multiset<int> st;
    for (int v : g[1]){
        dfs(v , 1 , k);
        st.insert(dp[v] + 1);
    }
    if (bad){
        return false;
    }
    else{
        while (st.empty() == 0){
            int x = *st.begin(); st.erase(st.begin());
            if (x >= k) continue;
            auto it = st.lower_bound(k - x);
            if (it == st.end()) return false;
            st.erase(it);
        }
        return true;
    }
}

void solve(){
    cin >> n;
    for (int i = 1 ; i < n ; i++){
        int u , v;
        cin >> u >> v;
        g[u].push_back(v);
        g[v].push_back(u);
    }
    int lef = 0 , rig = n - 1 , ans = -1;
    while (lef <= rig){
        int mid = (lef + rig) / 2;
        if (check(mid)){
            ans = mid;
            lef = mid + 1;
        }
        else{
            rig = mid - 1;
        }
    }
    cout << ans << "\n";
}

#define name "P"

int main(){
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    if (fopen(name".INP" , "r")){
        freopen(name".INP" , "r" , stdin);
        freopen(name".OUT" , "w" , stdout);
    }
    int t = 1; //cin >> t;
    while (t--) solve();
    return 0;
}

