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 N = 1e5 + 5;

int S[N][22] , ans[N] , n , m , x , y , res , Tay[N][22];

vector <int> G[N];

void dfs(int x , int f) {
  for(int i = 0;i < (int) G[x].size();++ i) {
    int V = G[x][i];
    if(V == f)  continue;
    dfs(V , x);
    ++ S[x][ans[V]];
    for(int i = ans[V] + 1;i < 22;++ i) S[x][i] += S[V][i];
  }
  
  for(int i = 21;i >= 0;-- i) if(S[x][i]){
      if(S[x][i] >= 2) {
        for(int j = i;j >= 0;-- j) Tay[x][j] = 1;
        break;
      }
      else Tay[x][i] = 1;
  }
  for(ans[x] = 0;Tay[x][ans[x]];++ ans[x]);
  res = max(res , ans[x]);
}

int main(void) {
  //freopen("jas.in" , "r" , stdin);
  //freopen("jas.out" , "w" , stdout);
  cin.sync_with_stdio(0);
  cin >> n;
  for(int i = 1;i < n;++ i) {
    cin >> x >> y;
    G[x].push_back(y);
    G[y].push_back(x);
  }
  dfs(1 , 0);
  cout << res << endl;
}
