#include <iostream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#define umap unordered_map
#define vi vector<int>
#define vb vector<bool>
#define pii pair<int,int>
#define repeat(n) for (int i = 0; i < n; i++)
using namespace std;
bool parno(int num) { return !(num & 1); };
umap<int, vi> povezanost;
vi tabla;
vb posecen;
int n;
bool je_list(int cvor_index) {
	int ne_posecenih_suseda = 0;
	for (int sused : povezanost[cvor_index]) {
		if (!posecen[sused]){
			ne_posecenih_suseda++;
		}
	}
	return ne_posecenih_suseda == 0;
}
pii max_dfs_cvor(int duzina, int cvor_index) { //Vraca par index, duzina
	posecen[cvor_index] = true;
	int max_duzina = -1;
	int index_kad_max = -1;
	if (tabla[cvor_index] == 1){
		max_duzina = duzina;
		index_kad_max = cvor_index;
	}
	for (int sused : povezanost[cvor_index]) {
		if (!posecen[sused]) {
			auto ret = max_dfs_cvor(duzina + 1, sused);
			if (ret.second > max_duzina) {
				max_duzina = ret.second;
				index_kad_max = ret.first;
			}
		}
	}
	return make_pair(index_kad_max, max_duzina);
}
int sracunaj_rastsrkanost() {
	posecen = vb(n);
	int prvi_cvor = -1;
	for (int i = 0; i < n; i++){
		if (tabla[i] == 1){
			prvi_cvor = max_dfs_cvor(0, i).first;
			break;
		}
	}
	posecen = vb(n);
	auto drugi = max_dfs_cvor(0, prvi_cvor);
	return drugi.second;
}
pair<vi, int> resi(int potez) {
	if (potez == tabla.size()){
		return make_pair(tabla, sracunaj_rastsrkanost());
	}
	if (parno(potez)){
		int tr_min = INT_MAX;
		vi tabla_kad_min;
		for (int i = 0; i < tabla.size(); i++){
			if (tabla[i] == 0){ //Polje je slobodno
				tabla[i] = 1;
				auto ret = resi(potez + 1);
				if (ret.second < tr_min){
					tr_min = ret.second;
					tabla_kad_min = ret.first;
				}
				tabla[i] = 0;
			}
		}
		return make_pair(tabla_kad_min, tr_min);
	}
	else {
		int tr_max = INT_MIN;
		vi tabla_kad_max;
		for (int i = 0; i < tabla.size(); i++){
			if (tabla[i] == 0){
				tabla[i] = 2;
				auto ret = resi(potez + 1);
				if (ret.second > tr_max){
					tr_max = ret.second;
					tabla_kad_max = ret.first;
				}
				tabla[i] = 0;
			}
		}
		return make_pair(tabla_kad_max, tr_max);
	}
}

int main()
{
	ios::sync_with_stdio(false);
	cin.tie(NULL);
	cin >> n;
	repeat(n - 1) {
		int prvi, drugi;
		cin >> prvi >> drugi; prvi--; drugi--;
		povezanost[prvi].push_back(drugi);
		povezanost[drugi].push_back(prvi);
	}
	tabla = vi(n);
	auto rez = resi(0);
	cout << rez.second;
	return 0;	
}