from collections import Counter, OrderedDict
from collections import deque
from sys import stdin
from bisect import *
from heapq import *
import math

g   = lambda : stdin.readline().strip()
gl  = lambda : g().split()
gil = lambda : [int(var) for var in gl()]
gfl = lambda : [float(var) for var in gl()]
gcl = lambda : list(g())
gbs = lambda : [int(var) for var in g()]
mod = int(1e9)+7
inf = float("inf")

n, = gil()
edges = OrderedDict()
adj = [[] for _ in range(n+1)]
for _ in range(n-1):
	x, y = gil()
	edges[(x, y)] = None
	edges[(y, x)] = None
	adj[x].append(y)
	adj[y].append(x)

dp = [1]*(n+1); vis = [0]*(n+1) ; fin = [0]*(n+1)

stack = [1]

while stack :
	node = stack[-1]
	if vis[node]:
		for c in adj[node]:
			if fin[c] : dp[node]+=dp[c]
		fin[node] = 1
		stack.pop()
	else:
		vis[node] = 1
		for c in adj[node]:
			if vis[c] == 0:
				stack.append(c)
vis = [0]*(n+1)
stack = [1]
costs = []
while stack :
	node = stack.pop()
	vis[node] = 1
	for c in adj[node]:
		if vis[c] == 0 :
			stack.append(c)
			costs.append((dp[c]*(n-dp[c]), node, c))


costs.sort(key = lambda x : x[0], reverse=True)
val = n-2
for _, x, y in costs:
	edges[x, y] = val
	val -= 1

for val in edges.values():
	if val is not None :
		print(val)
