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;
#define N 111111
inline int read(){
	int x=0,f=1;
	char c=getchar();
	while (c<'0' || c>'9'){
		if (c=='-') f=-1;
		c=getchar();
	}
	while (c>='0' && c<='9'){
		x=x*10+c-48;
		c=getchar();
	}
	return x*f;
}
int n,ans,f[N][33];
int tot,a[N*2],b[N*2],c[N];
void add(int x,int y){
	tot++;a[tot]=y;b[tot]=c[x];c[x]=tot;
}
void dfs(int u,int fa){
	for (int i=c[u];i;i=b[i]){
		int to=a[i];
		if (to==fa){
			continue;
		}
		dfs(to,u);
		for (int i=0;i<=20;++i){
			f[u][i]+=f[to][i];
		}
	}
	int p=0;
	for (int i=20;i>=0;--i){
		if (f[u][i]>1){
			p=i+1;break;
		}
	}
	while (f[u][p]) p++;
	f[u][p]++;
	for (int i=0;i<p;++i){
		f[u][i]=0;
	}
	ans=max(ans,p);
}
int main(){
	//freopen(".in","r",stdin);
	//freopen(".out","w",stdout);

	int n=read();
	for (int i=1;i<n;++i){
		int u=read(),v=read();
		add(u,v);
		add(v,u);
	}
	dfs(1,0);
	cout<<ans<<endl;
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}
