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;

typedef vector<int> vi;
const int maxn = 100010;
#define pb push_back

vi g[maxn];

int c[maxn];
int bt[1024 + 2];

int low_bit(int x) { return x & -x; }
int lg(int x) { return x > 1024 ? 10 + lg(x >> 10) : bt[x]; }

int dfs(int u,int par) {
	int val = 0, lim = 0;
	for(auto v: g[u]) if(v != par) {
		int r = dfs(v, u);
		lim |= r & val;
		val |= r;
	}
	c[u] = 0;
	while((1 << c[u]) <= lim || (val >> c[u] & 1) > 0) ++c[u];
	val ^= val & ((1<<c[u]) - 1);
	val |= 1 << c[u];
	return val;
}

int main() {
	for(int i = 0; i <= 10; ++i) bt[1 << i] = i;
	int n; scanf("%d", &n);
	for(int i = 1; i < n; ++i) {
		int u, v; scanf("%d%d", &u, &v);
		g[u].pb(v); g[v].pb(u);
	}
	dfs(1, 0);
	cout << *max_element(c + 1, c + n + 1) << endl;
	return 0;
}
