10
4 2
7 4
2 6
2 5
4 8
10 3
2 9
9 1
5 10
 10
5 10
7 8
8 3
2 6
3 2
9 7
4 5
10 1
6 4
 4
4 1
4 3
4 2
 3
3 1
1 2
 9
1 2
1 3
1 4
1 5
1 6
6 7
6 8
8 9
 5
1 5
2 3
2 4
1 2
 8
6 1
4 7
4 8
8 5
7 6
4 3
4 2
 7
5 6
5 7
5 1
7 4
6 3
3 2
 3
1 3
3 2
 2
1 2
 5
5 4
4 3
3 1
5 2
 6
1 6
3 1
6 4
5 3
2 5
 11
8 9
2 7
1 11
3 2
9 1
8 5
8 6
5 4
4 10
8 3
 11
11 9
6 7
7 1
8 11
5 6
3 5
9 3
10 8
2 4
4 10
 12
12 6
6 7
8 11
4 8
10 4
12 3
2 10
6 2
12 9
4 1
9 5

-1
 9
 1
 1
 3
 3
 -1
 -1
 1
 1
 1
 5
 1
 5
 -1

#include <cstdio>
#include <algorithm>

using namespace std;

struct str
{
	int g[5],h[5];
	
	inline bool check()
	{
		if (g[0]<=4)
			return true;
		else
			return false;
	}
	
	inline void insert(int x)
	{
		if (g[0]>4)
			return;
		for (int i=1;i<=g[0];i++)
			if (x==g[i])
			{
				h[i]++;
				return;
			}
		g[0]++;
		if (g[0]<=4)
			g[g[0]]=x,h[g[0]]=1;
		return;
	}
	
	inline void del(int x)
	{
		for (int i=1;i<=g[0];i++)
			if (x==g[i])
			{
				h[i]--;
				if ((g[0]<=4) && (! h[i]))
				{
					swap(g[g[0]],g[i]);
					swap(h[g[0]],h[i]);
					g[0]--;
				}
				return;
			}
	}
};

str g[300000];
int edge[500000],next[500000],first[300000];
int i,n,s,t,x,y,sum_edge;

inline void checkans(int x)
{
	while (! (x&1))
		x=x/2;
	s=min(s,x);
	return;
}

inline void addedge(int x,int y)
{
	sum_edge++,edge[sum_edge]=y,next[sum_edge]=first[x],first[x]=sum_edge;
	return;
}

inline void dfs1(int x,int y,int z)
{
	bool b=true;
	for (int i=first[x];(i!=0) && (g[x].check());i=next[i])
		if (edge[i]!=y)
		{
			dfs1(edge[i],x,z+1);
			b=false;
			if (! g[edge[i]].check())
				g[x].g[0]=5;
			else
			{
				for (int j=1;j<=g[edge[i]].g[0];j++)
					g[x].insert(g[edge[i]].g[j]+1);
				if (g[edge[i]].g[0]>1)
					g[x].h[0]=1;
			}
		}
	if (b)
		g[x].insert(1);
	return;
}

inline void dfs2(int x,int y,int z,str t)
{
	if (t.g[0]>1)
		return;
	for (int i=1;i<=t.g[0];i++)
		g[x].insert(t.g[i]+1);
	if (! g[x].check())
		return;
	if ((g[x].g[0]<=2) && (! g[x].h[0]))
		if (g[x].g[0]==2)
			checkans(g[x].g[1]+g[x].g[2]-2);
		else
			checkans(g[x].g[1]-1);
	str r;
	for (int i=first[x];i!=0;i=next[i])
		if (edge[i]!=y)
		{
			r=g[edge[i]];
			for (int j=1;j<=r.g[0];j++)
				g[x].del(r.g[j]+1);
			dfs2(edge[i],x,z+1,g[x]);
			for (int j=1;j<=r.g[0];j++)
				g[x].insert(r.g[j]+1);
		}
	return;
}

int main()
{
	scanf("%d",&n);
	if (n==2)
	{
		printf("1");
		return 0;
	}
	for (i=1;i<n;i++)
	{
		scanf("%d%d",&x,&y);
		addedge(x,y),addedge(y,x);
	}
	for (i=1;i<=n;i++)
		if (next[first[i]])
			t=i;
	s=n;
	dfs1(t,0,0);
	dfs2(t,0,0,g[n+1]);
	if (s<n)
		printf("%d",s);
	else
		printf("-1");
	return 0;
}