# -*- coding: utf-8 -*-

import sys

def input(): return sys.stdin.readline().strip()
def list2d(a, b, c): return [[c] * b for i in range(a)]
def list3d(a, b, c, d): return [[[d] * c for j in range(b)] for i in range(a)]
def list4d(a, b, c, d, e): return [[[[e] * d for j in range(c)] for j in range(b)] for i in range(a)]
def ceil(x, y=1): return int(-(-x // y))
def INT(): return int(input())
def MAP(): return map(int, input().split())
def LIST(N=None): return list(MAP()) if N is None else [INT() for i in range(N)]
def Yes(): print('Yes')
def No(): print('No')
def YES(): print('YES')
def NO(): print('NO')
# sys.setrecursionlimit(10 ** 9)
INF = 10 ** 18
MOD = 10 ** 9 + 7

def dfs(nodes, src):

    N = len(nodes)
    stack = [(src, -1, 0)]
    dist = [INF] * N
    while stack:
        u, prev, c = stack.pop()
        dist[u] = c
        for v in nodes[u]:
            if v != prev:
                stack.append((v, u, c+1))
    return dist

def bfs(nodes, v1, v2):
    from collections import deque

    que = deque([(v1, -1), (v2, -1)])
    cnt = 0
    visited = [0] * N
    while que:
        u, prev = que.popleft()
        visited[u] = 1
        for v in nodes[u]:
            if visited[v]:
                continue
            if prev == v:
                continue
            ans[ptoi[(min(u, v), max(u, v))]] = cnt
            cnt += 1
            que.append((v, u))

N = INT()
nodes = [[] for i in range(N)]
ptoi = {}
ans = [0] * (N-1)
for i in range(N-1):
    a, b = MAP()
    a -= 1; b -= 1
    nodes[a].append(b)
    nodes[b].append(a)
    ptoi[min(a, b), max(a, b)] = i

dist1 = dfs(nodes, 0)
v1 = dist1.index(max(dist1))
dist2 = dfs(nodes, v1)
v2 = dist2.index(max(dist2))
bfs(nodes, v1, v2)
[print(a) for a in ans]
