We will recursively define uninity of a tree, as follows: (Uni is a Japanese word for sea urchins.)

* A tree consisting of one vertex is a tree of uninity 0.
* Suppose there are zero or more trees of uninity k, and a vertex v. If a vertex is selected from each tree of uninity k and connected to v with an edge, the resulting tree is a tree of uninity k+1.



It can be shown that a tree of uninity k is also a tree of uninity k+1,k+2,..., and so forth.

You are given a tree consisting of N vertices. The vertices of the tree are numbered 1 through N, and the i-th of the N-1 edges connects vertices a_i and b_i.

Find the minimum k such that the given tree is a tree of uninity k.

Constraints

* 2 ≦ N ≦ 10^5
* 1 ≦ a_i, b_i ≦ N(1 ≦ i ≦ N-1)
* The given graph is a tree.

Input

The input is given from Standard Input in the following format:


N
a_1 b_1
:
a_{N-1} b_{N-1}


Output

Print the minimum k such that the given tree is a tree of uninity k.

Examples

Input

7
1 2
2 3
2 4
4 6
6 7
7 5


Output

2


Input

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


Output

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

const int maxn=1<<18;

int n,lg[maxn];
int tote,TO[maxn],NEXT[maxn],FIR[maxn];

void addedge(int u,int v)
{
	TO[++tote]=v;
	NEXT[tote]=FIR[u];
	FIR[u]=tote;
}

int dfs(int u,int f)
{
	int bit=0,over=0,pos;
	for (int p=FIR[u];p;p=NEXT[p])
	{
		int v=TO[p];
		if (v==f) continue;
		int tmp=dfs(v,u);
		over|=bit&tmp;
		bit|=tmp;
	}
	for (pos=lg[over]+1;;pos++)
		if (!((bit>>pos)&1)) break;
	bit|=1<<pos;
	bit&=maxn-(1<<pos);
	return bit;
}

int main()
{
#ifdef h10
	freopen("D.in","r",stdin);
	freopen("D.out","w",stdout);
#endif
	int i,u,v;
	scanf("%d",&n);
	for (i=1;i<n;i++)
	{
		scanf("%d%d",&u,&v);
		addedge(u,v);
		addedge(v,u);
	}
	lg[0]=-1;
	for (i=0;1<<i<maxn;i++) lg[1<<i]=i;
	for (i=1;i<maxn;i++) lg[i]=max(lg[i],lg[i-1]);
	printf("%d\n",lg[dfs(1,0)]);
}
