definit():for i inrange(n):
father[i]=i
deffind(x):return x if x==father[x]else find(father[x])defjoin(x,y):
x = find(x)
y = find(y)if x==y:return
father[x]=y
defisSame(x,y):
x = find(x)
y = find(y)returnTrueif x==y elseFalseif __name__=='__main__':
n =int(input())
father =[0]*n
init()for _ inrange(n):
x,y =map(int,input().split())if isSame(x-1,y-1):print('{} {}'.format(str(x),str(y)))else:
join(x-1,y-1)
109.冗余连接II
definit():for i inrange(n):
father[i]=i
deffind(x):return x if x==father[x]else find(father[x])defjoin(x,y):
x = find(x)
y = find(y)if x==y:return
father[y]=x
defisSame(x,y):
x = find(x)
y = find(y)returnTrueif x==y elseFalsedefisTree(edges, deleteidx):
init()for i inrange(n):if i == deleteidx:continueif isSame(edges[i][0]-1,edges[i][1]-1):returnFalse
join(edges[i][0]-1, edges[i][1]-1)returnTruedefgetremoveedge(edges):
init()for i inrange(n):if isSame(edges[i][0]-1,edges[i][1]-1):print(('{} {}').format(str(edges[i][0]),str(edges[i][1])))else:
join(edges[i][0]-1, edges[i][1]-1)if __name__=='__main__':
n =int(input())
father =[0]*n
init()
edges =[]
indegrees =[0]*n
for _ inrange(n):
x,y =map(int,input().split())
indegrees[y-1]+=1
edges.append([x,y])
vec =[]for i inrange(n-1,-1,-1):if indegrees[edges[i][1]-1]==2:
vec.append(i)if vec:if isTree(edges,vec[0]):print(('{} {}').format(str(edges[vec[0]][0]),str(edges[vec[0]][1])))else:print(('{} {}').format(str(edges[vec[1]][0]),str(edges[vec[1]][1])))else:
getremoveedge(edges)