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 <iostream>
#include <cstdio>
#include <algorithm>
#define rep(i,a,b) for(int i = a; i <= b; i++)
#define dep(i,a,b) for(int i = a; i >= b; i--)
using namespace std;
const int N = 100010;

struct edge{ int to, pre; }e[N << 1]; int u[N], l = 0;
void ins(int a, int b) { e[++l] = (edge){b, u[a]}, u[a] = l; }
#define v e[i].to
#define reg(i,a) for(int i = u[a]; i; i = e[i].pre)

int w[N], ans = 0;
void dfs(int x, int f) {
	w[x] = 0; int cnt[19]; rep(i,0,18) cnt[i] = 0;
	reg(i,x) if (v != f) { dfs(v, x); rep(j,0,18) if (w[v] >> j & 1) cnt[j]++; }
	int t = 0; dep(i,18,0) if (!cnt[i]) t = i; else if (cnt[i] >= 2) break;
	ans = max(ans, t);
	w[x] = 1 << t; rep(i,t + 1,18) if (cnt[i]) w[x] |= 1 << i;
}

int main() {
	int n; scanf("%d",&n);
	rep(i,1,n - 1) { int a, b; scanf("%d%d",&a,&b), ins(a, b), ins(b, a); }
	dfs(1,0); printf("%d\n",ans);
	return 0;
}