#d3と同一解法

n=int(eval(input()))

import sys

#再帰関数の再帰回数を変更

sys.setrecursionlimit(10**6)

s=[[] for _ in range(n)]



for i in range(n-1):

    a,b=list(map(int,input().split()))

    s[a-1].append((b-1,i))

    s[b-1].append((a-1,i))



l=[0]*(n-1)



def dfs(node,pre_col,par):

    col=1

    for nei,i in s[node]:

        if nei==par:

            continue

        if col==pre_col:

            col+=1

        l[i]=col

        dfs(nei,col,node)

        col+=1

dfs(0,-1,-1)

print((max(l)))

for i in l:

    print(i)

import sys

sys.setrecursionlimit(500000)

N = int(eval(input()))

E = [[] for _ in range(N+1)]

for i in range(N-1):

    a, b = list(map(int, input().split()))

    E[a].append((b, i))

    E[b].append((a, i))

K = max(len(e) for e in E)

print(K)

Ans = [-1] * (N-1)

def dfs(v=1, p=0, p_col=-1):

    col = 1

    for u, idx in E[v]:

        if u!=p: #木構造の逆向きの矢印を除くための条件

            if col == p_col:

                col += 1

            Ans[idx] = col

            #print(p_col)

            dfs(u, v, col) #u;調べる頂点 v;直前に調べた辺で、調べる頂点と結ばれている頂点　col;直前に調べた辺の色番号

            col += 1 #最深部まで調べたら デフォルトの色=最後に調べた辺の色+1とする

            #最深部に繋がった辺の色+1してやれば、次の辺の色は必ず条件を満たしてくれる



dfs()

print(("\n".join(map(str, Ans))))

# d3と同一解法
n = int(eval(input()))
import sys

# 再帰関数の再帰回数を変更
sys.setrecursionlimit(10**6)
s = [[] for _ in range(n)]
for i in range(n - 1):
    a, b = list(map(int, input().split()))
    s[a - 1].append((b - 1, i))
    s[b - 1].append((a - 1, i))
l = [0] * (n - 1)


def dfs(node, pre_col, par):
    col = 1
    for nei, i in s[node]:
        if nei == par:
            continue
        if col == pre_col:
            col += 1
        l[i] = col
        dfs(nei, col, node)
        col += 1


dfs(0, -1, -1)
print((max(l)))
for i in l:
    print(i)

import sys

sys.setrecursionlimit(500000)
N = int(eval(input()))
E = [[] for _ in range(N + 1)]
for i in range(N - 1):
    a, b = list(map(int, input().split()))
    E[a].append((b, i))
    E[b].append((a, i))
K = max(len(e) for e in E)
print(K)
Ans = [-1] * (N - 1)


def dfs(v=1, p=0, p_col=-1):
    col = 1
    for u, idx in E[v]:
        if u != p:  # 木構造の逆向きの矢印を除くための条件
            if col == p_col:
                col += 1
            Ans[idx] = col
            # print(p_col)
            dfs(u, v, col)  # u;調べる頂点 v;直前に調べた辺で、調べる頂点と結ばれている頂点　col;直前に調べた辺の色番号
            col += 1  # 最深部まで調べたら デフォルトの色=最後に調べた辺の色+1とする
            # 最深部に繋がった辺の色+1してやれば、次の辺の色は必ず条件を満たしてくれる


dfs()
print(("\n".join(map(str, Ans))))

-# d3と同一解法 -n = int(eval(input())) -# 再帰関数の再帰回数を変更 -sys.setrecursionlimit(10**6) -s = [[] for _ in range(n)] -for i in range(n - 1): +sys.setrecursionlimit(500000) +N = int(eval(input())) +E = [[] for _ in range(N + 1)] +for i in range(N - 1): -    s[a - 1].append((b - 1, i)) -    s[b - 1].append((a - 1, i)) -l = [0] * (n - 1) +    E[a].append((b, i)) +    E[b].append((a, i)) +K = max(len(e) for e in E) +print(K) +Ans = [-1] * (N - 1) -def dfs(node, pre_col, par): +def dfs(v=1, p=0, p_col=-1): -    for nei, i in s[node]: -        if nei == par: -            continue -        if col == pre_col: -            col += 1 -        l[i] = col -        dfs(nei, col, node) -        col += 1 +    for u, idx in E[v]: +        if u != p:  # 木構造の逆向きの矢印を除くための条件 +            if col == p_col: +                col += 1 +            Ans[idx] = col +            # print(p_col) +            dfs(u, v, col)  # u;調べる頂点 v;直前に調べた辺で、調べる頂点と結ばれている頂点　col;直前に調べた辺の色番号 +            col += 1  # 最深部まで調べたら デフォルトの色=最後に調べた辺の色+1とする +            # 最深部に繋がった辺の色+1してやれば、次の辺の色は必ず条件を満たしてくれる -dfs(0, -1, -1) -print((max(l))) -for i in l: -    print(i) +dfs() +print(("\n".join(map(str, Ans))))