#include <bits/stdc++.h>
using namespace std;

const int MAXN = 3e5+7;
int n;

vector<int> graf[MAXN];

int akt_spr; //Przekazuję z maina którą wartość aktualnie sprawdzam

bool sprawdz(int poprz, int v, int ile) {
	//Potrzebuję graf[v].size()-1 ekip budowlanych ale w każdej jednostce czasowej dostaję akt_spr
	//i jeszcze może coś w ile zostało do wykorzystania
    ile += akt_spr - (graf[v].size() - 1);
    if(v==1) ile--; //Bo korzeń nie ma ojca dlatego powinnam była tam wyżej zrobić zamiast
    //- (graf[v].size()-1) po prostu - graf[v].size()
    if(ile<0) return 0; //No i tutaj jak mi wychodzi ujemnie to się nie da
    
    for(auto sasiad : graf[v]) {
        if(sasiad != poprz) {
            bool akt = sprawdz(v, sasiad, ile);
            if(!akt) return 0;
        }
    }
    return 1;
}

int main() {

    cin >> n;

    for(int i=0; i<n-1; i++) {
        int a, b;
        cin >> a >> b;
        graf[a].push_back(b);
        graf[b].push_back(a);
    }

	//Pomińmy fakt że działa to w O(n^2), bo dostaję WA i tak

    for(int i=0; i<=n; i++) {
        akt_spr = i;
        if(sprawdz(0, 1, 0)) {
            cout << i << "\n";
            return 0;
        }
    }


    return 0;
}