#include <bits/stdc++.h>
using namespace std;
#define pb push_back
const int N=100050;
vector<int> E[N];
int par[N],dep[N];
vector<int> nodes;
int n;
void DFS(int u, int p)
{
	par[u]=p;
	dep[u]=dep[p]+1;
	nodes.pb(u);
	for(int v:E[u]) if(v!=p) DFS(v,u);
}
vector<pair<int,int>> sz;
int sum_c2;
bool CheckD()
{
	int sum=0;
	for(auto p:sz) sum+=p.first;
	if(sz.size()>=4) return 1;
	if(sz.size()==3 && sum>=4) return 1;
	if(sz.size()==3 && sum==3 && n%2==1) return 1;
	if(sz.size()==2 && sz[0].first>=2 && sz[1].first>=2) return 1;
	if(sz.size()==2 && (sz[0].first==1 || sz[1].first==1) && sum>=3 && n%2==1) return 1;
	return 0;
}
bool CheckDM1()
{
	int sum=0;
	for(auto p:sz) sum+=p.first;
	if(sz.size()==3 && sum==3 && n%2==0) return 1;
	if(sz.size()==2 && sum>=3 && n%2==0) return 1;
	if(sz.size()==2 && sum==2 && n%2==1) return 1;
	if(sz.size()==2 && sum==2 && n%2==0 && sum_c2>=2) return 1;
	if(sz.size()==2 && sum==2 && n%2==0 && sum_c2==1 && max(sz[0].second,sz[1].second)>=2) return 1;
	if(sz.size()==2 && sum==2 && n%2==0 && sum_c2==0 && min(sz[0].second,sz[1].second)>=2) return 1;
	return 0;
}
void input()
{
	scanf("%i",&n);
	for(int i=1;i<=n;i++) E[i].clear();
	for(int i=1,u,v;i<n;i++) scanf("%i %i",&u,&v),E[u].pb(v),E[v].pb(u);
}
int Solve()
{
	//scanf("%i",&n);
	//for(int i=1,u,v;i<n;i++) scanf("%i %i",&u,&v),E[u].pb(v),E[v].pb(u);
	//init
	sz.clear();
	sum_c2=0;


    DFS(1,0);
    int cen=1,den=1;
    for(int i=1;i<=n;i++) if(dep[i]>dep[cen]) cen=i;
    DFS(cen,0);
    for(int i=1;i<=n;i++) if(dep[i]>dep[den]) den=i;
    int diam=dep[den]-1;
    if(diam==2)
	{
		if(n>=5) return 2;//printf("2\n");
		else return 1;//printf("1\n");
		//return 0;
	}
	auto Push=[&](int u, int p, int mx)
	{
		nodes.clear();
		dep[p]=0;
		DFS(u,p);
		int c1=0,c2=0;
		for(int i:nodes)
		{
			if(dep[i]==mx) c1++;
			if(dep[i]==mx-1) c2++;
		}
		if(c1>0) sz.pb({c1,c2});
		else sum_c2+=c2;
	};
    if(diam%2==0)
	{
		int u=den;
		while(dep[u]>diam/2+1) u=par[u];
		int mx=diam/2;
		for(int v:E[u]) Push(v,u,mx);
	}
	else
	{
		int u=den;
		while(dep[u]>diam/2+2) u=par[u];
		int mx=diam/2+1,p=par[u];
		Push(u,p,mx);
		Push(p,u,mx);
	}
	if(CheckD()) return diam;//printf("%i\n",diam);
	else if(CheckDM1()) return diam-1;//printf("%i\n",diam-1);
	else return diam-2;//printf("%i\n",diam-2);
	//return 0;
}
void Run()
{
	input();
	printf("%i\n",Solve());
}
const int H=1<<10;
//int dp[H][H];
//bool was[H][H];
map<int,map<int,int>> dp;
map<int,map<int,bool>> was;
int dfs_d;
int Diam_DFS(int u, int p, int my)
{
	int best=-1e7;
	if(my>>(u-1)&1) best=0;
	for(int v:E[u]) if(v!=p)
	{
		int tmp=Diam_DFS(v,u,my);
		dfs_d=max(dfs_d,best+tmp+1);
		best=max(best,tmp+1);
	}
	return best;
}
int DP(int my, int mask, int pl)
{
	if(was[my][mask]) return dp[my][mask];
	was[my][mask]=1;
	if(mask==0)
	{
		int st=0;
		for(int i=1;i<=n;i++) if(my>>(i-1)&1){ st=i;break;}
		dfs_d=0;
		Diam_DFS(st,0,my);
		dp[my][mask]=dfs_d;
	}
	else
	{
		if(pl==0)
		{
			dp[my][mask]=0;
			for(int i=0;i<n;i++) if(mask>>i&1)
				dp[my][mask]=max(dp[my][mask],DP(my,mask^(1<<i),pl^1));
		}
		else
		{
			dp[my][mask]=1e9;
			for(int i=0;i<n;i++) if(mask>>i&1)
				dp[my][mask]=min(dp[my][mask],DP(my^(1<<i),mask^(1<<i),pl^1));
		}
	}
	return dp[my][mask];
}
int BruteForce()
{
	//for(int i=0;i<1<<n;i++)
	//	for(int j=0;j<1<<n;j++)
	//		was[i][j]=0;
	was.clear();
	return DP(0,(1<<n)-1,1);
}
void RunBruteForce()
{
	input();
	printf("%i\n",BruteForce());
}
int e_u[N],e_v[N];
void MakeTestCase()
{
	n=rand()%12+3;
	for(int i=1;i<=n;i++) E[i].clear();
	for(int i=2;i<=n;i++)
	{
		int j=rand()%(i-1)+1;
		e_u[i-1]=i;e_v[i-1]=j;
		E[i].pb(j);
		E[j].pb(i);
	}
}
void Print(int sol, int bsol)
{
	printf("%i\n",n);
	for(int i=1;i<n;i++) printf("%i %i\n",e_u[i],e_v[i]);
	printf("Solve: %i\n",sol);
	printf("Brute: %i\n",bsol);
}
#define ldb long double
double GetTime(){ return (ldb)clock()/CLOCKS_PER_SEC;}
double s_time,e_time,d_time;
void Start(){ s_time=GetTime();}
void Stop(){ e_time=GetTime();d_time=e_time-s_time;}
void Test()
{
	srand(time(0));
	cout<<fixed<<setprecision(4);
	int work=100000;
	double max_time=0;
	bool speed_only=0;
	for(int i=1;i<=work;i++)
	{
		MakeTestCase();
		int bsol;
		if(!speed_only) bsol=BruteForce();
		Start();
		int sol=Solve();
		Stop();
		if(!speed_only && sol!=bsol)
		{
			Print(sol,bsol);
			return;
		}
		max_time=max(max_time,d_time);
		cout<<i<<":OK, max time so far="<<max_time<<"\n";
	}
	cout<<":D\n";
}
int main()
{
	Run();
	return 0;
}