Buggy python submission (verdict: Runtime Error):
理解できないので後回し
import sys

sys.setrecursionlimit(10 ** 5 + 10)


def input(): return sys.stdin.readline().strip()


def resolve():
    # https://atcoder.jp/contests/abc146/tasks/abc146_d
    # https://qiita.com/drken/items/a803d4fc4a727e02f7ba#4-4-%E6%A0%B9%E3%81%AE%E3%81%AA%E3%81%84%E6%9C%A8%E3%81%AE%E8%B5%B0%E6%9F%BB
    N = int(input())
    G = [[] for _ in range(N)]
    for i in range(N - 1):
        a, b = map(int, input().split())
        # G[頂点]に、(辺番号, 行き先)の情報を記入
        # 辺番号など不要で、行き先だけ記入すればいいこともある
        G[a - 1].append((i, b - 1))
        G[b - 1].append((i, a - 1))
    ans = [0] * (N - 1)

    # now_nd: 現在探索中の頂点、parent: now_ndの親(now_ndが根のときは - 1)。もうひとつの引数で調べたいものや持っておきたい情報をとる（ex. 深さ）。今回は親からそのノードへのびる辺の色pre_cl
    def dfs(G, now_nd, parent, pre_cl):
        cl = 1  # 1種類目

        for (num, nxt_nd) in G[now_nd]:
            if nxt_nd == parent:  # 逆流防止
                continue
            nxt_cl = cl  # 辺の色を指定
            if nxt_cl == pre_cl:  # かぶったら色変
                nxt_cl += 1
            ans[num] = nxt_cl
            dfs(G, nxt_nd, now_nd, nxt_cl)
            cl = nxt_cl + 1

    root = 0
    dfs(G, root, -1, -1)
    print(max(ans))
    for a in ans:
        print(a)


resolve()

Fixed submission:
import sys
sys.setrecursionlimit(10 ** 5 + 10)


def input(): return sys.stdin.readline().strip()


def resolve():
    """
    https://qiita.com/drken/items/4a7869c5e304883f539b#3-3-dfs-%E3%81%AE%E5%86%8D%E5%B8%B0%E9%96%A2%E6%95%B0%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E5%AE%9F%E8%A3%85
    cf. https://atcoder.jp/contests/abc138/submissions/13273052
    """

    from collections import deque

    N= int(input())
    M=N-1  # 頂点数，辺数
    # グラフ入力受取 (ここでは無向グラフを想定)
    G = [[] for _ in range(N)]
    for i in range(M):
        a, b = map(int, input().split())
        a -= 1
        b -= 1
        G[a].append((b, i))
        G[b].append((a, i))

    seen = [False]*N
    res = [0]*M


    def dfs(G, v, pc):
        color = 1
        if color == pc:
            color += 1
        seen[v] = True
        stack = deque([(v,-1)])
        while stack:
            v,pc = stack.pop()
            color=1
            for next_v, edge_ind in G[v]:
                if seen[next_v]:
                    continue
                if color == pc:
                    color += 1
                res[edge_ind] = color
                seen[next_v] = True
                stack.append((next_v,color))
                color+=1

            

    # 頂点 0 をスタートとした探索
    dfs(G, 0, -1)
    print(max(res))
    for i in res:
        print(i)



resolve()

Buggy python submission (verdict: Runtime Error):
# https://atcoder.jp/contests/abc146/tasks/abc146_d
# https://qiita.com/drken/items/a803d4fc4a727e02f7ba#4-4-%E6%A0%B9%E3%81%AE%E3%81%AA%E3%81%84%E6%9C%A8%E3%81%AE%E8%B5%B0%E6%9F%BB
N = int(input())
G = [[] for _ in range(N)]
for i in range(N - 1):
    a, b = map(int, input().split())
    # G[頂点]に、(辺番号, 行き先)の情報を記入
    # 辺番号など不要で、行き先だけ記入すればいいこともある
    G[a - 1].append((i, b - 1))
    G[b - 1].append((i, a - 1))
ans = [0] * (N - 1)

# now_nd: 現在探索中の頂点、parent: now_ndの親(now_ndが根のときは - 1)。もうひとつの引数で調べたいものや持っておきたい情報をとる（ex. 深さ）。今回は親からそのノードへのびる辺の色pre_cl
def dfs(G, now_nd, parent, pre_cl):
    color = 1  # 1種類目

    for (num, nxt_nd) in G[now_nd]:
        if nxt_nd == parent:  # 逆流防止
            continue
        nxt_cl = color  # 辺の色を指定
        if nxt_cl == pre_cl:  # かぶったら色変
            nxt_cl += 1
        ans[num] = color
        dfs(G, nxt_nd, now_nd, nxt_cl) # G[now_nd]のnxt_ndがなくなったら、つまり葉まで調べ尽くしたら
        color = nxt_cl + 1  # 次の頂点で試す色。今使ったのとは違う種類

root = 0
dfs(G, root, -1, -1)
print(max(ans))
for a in ans:
    print(a)

Fixed submission:
import sys
sys.setrecursionlimit(10 ** 5 + 10)


def input(): return sys.stdin.readline().strip()


def resolve():
    """
    https://qiita.com/drken/items/4a7869c5e304883f539b#3-3-dfs-%E3%81%AE%E5%86%8D%E5%B8%B0%E9%96%A2%E6%95%B0%E3%82%92%E7%94%A8%E3%81%84%E3%81%9F%E5%AE%9F%E8%A3%85
    cf. https://atcoder.jp/contests/abc138/submissions/13273052
    """

    from collections import deque

    N= int(input())
    M=N-1  # 頂点数，辺数
    # グラフ入力受取 (ここでは無向グラフを想定)
    G = [[] for _ in range(N)]
    for i in range(M):
        a, b = map(int, input().split())
        a -= 1
        b -= 1
        G[a].append((b, i))
        G[b].append((a, i))

    seen = [False]*N
    res = [0]*M


    def dfs(G, v, pc):
        color = 1
        if color == pc:
            color += 1
        seen[v] = True
        stack = deque([(v,-1)])
        while stack:
            v,pc = stack.pop()
            color=1
            for next_v, edge_ind in G[v]:
                if seen[next_v]:
                    continue
                if color == pc:
                    color += 1
                res[edge_ind] = color
                seen[next_v] = True
                stack.append((next_v,color))
                color+=1

            

    # 頂点 0 をスタートとした探索
    dfs(G, 0, -1)
    print(max(res))
    for i in res:
        print(i)



resolve()