Problem:
Score : 400 points

Problem Statement

Given is a tree G with N vertices.
The vertices are numbered 1 through N, and the i-th edge connects Vertex a_i and Vertex b_i.

Consider painting the edges in G with some number of colors.
We want to paint them so that, for each vertex, the colors of the edges incident to that vertex are all different.

Among the colorings satisfying the condition above, construct one that uses the minimum number of colors.

Constraints

2 \le N \le 10^5

1 \le a_i \lt b_i \le N

All values in input are integers.

The given graph is a tree.

Input

Input is given from Standard Input in the following format:

N
a_1 b_1
a_2 b_2
\vdots
a_{N-1} b_{N-1}

Output

Print N lines.

The first line should contain K, the number of colors used.

The (i+1)-th line (1 \le i \le N-1) should contain c_i, the integer representing the color of the i-th edge, where 1 \le c_i \le K must hold.

If there are multiple colorings with the minimum number of colors that satisfy the condition, printing any of them will be accepted.

Sample Input 1

3
1 2
2 3

Sample Output 1

2
1
2

Sample Input 2

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

Sample Output 2

4
1
2
3
4
1
1
2

Sample Input 3

6
1 2
1 3
1 4
1 5
1 6

Sample Output 3

5
1
2
3
4
5

Solution in PyPy3 (2.4.0) (judge verdict: Time Limit Exceeded)

# 色の最大は辺が一番多い頂点
# 各頂点が現在持ってる色を覚える -> 2次元配列 : color_num = [[]*N]
# 答えを出力するための部分 -> 2次元配列 : ans = [[] * N for _ in range(N)]
# 答えの出し方はN-1ループでa[i], b[i]をansにいれる
def main():
    from collections import deque
    N = int(input())
    graph = {i:[] for i in range(N)}
    A = [0] * (N-1)
    B = [0] * (N-1)
    for i in range(N-1):
        a, b = map(int, input().split())
        a -= 1
        b -= 1
        graph[a].append(b)
        graph[b].append(a)
        A[i] = a
        B[i] = b        
        if i == 0:
            start = a

    K = 0
    for some in graph.values():
        K = max(len(some), K)

    # BFSのためのデータ構造
    que = deque()
    dist = [False] * N

    # 初期条件
    que.append(start)
    color_num = {i:{} for i in range(N)}
    dist[start] = True

    # BFS開始
    while que:
        v = que[0]
        que.popleft()
        tmp = 0
        for new_v in graph[v]:
            if dist[new_v]:
                continue
            # 新たな頂点 new_vについて距離情報を更新してキューを追加する
            dist[new_v] = True
            que.append(new_v)
            # 色を塗る
            for k in range(tmp+1, K+1):
                if k in color_num[v].values():
                    continue
                else:
                    color_num[v][new_v] = k
                    color_num[new_v][v] = k
                    tmp = k
                    break
    # 答えの出力
    print(K)
    for i in range(N-1):
        print(color_num[A[i]][B[i]])

if __name__ == "__main__":
    main()