import sys input=sys.stdin.buffer.readline N=int(input()) X=[list(map(int,input().split())) for i in range(N)] for i in range(N): for j in range(2): X[i][j]-=1 Q=[[] for i in range(N)] for i in range(N): for j in range(2): Q[X[i][j]].append(j*N+i) G=[[] for i in range(N*6)] v,w=0,0 for i in range(N): w+=len(Q[i]) for j in range(len(Q[i])): if j: G[(N+Q[i][j])%(2*N)].append(2*N+(v+j-1)*2) if j+1!=len(Q[i]): G[(N+Q[i][j])%(2*N)].append(2*N+(v+j+1)*2+1) G[2*N+(v+j)*2].append(Q[i][j]) G[2*N+(v+j)*2+1].append(Q[i][j]) for j in range(v,w): if j!=v: G[2*N+j*2].append(2*N+(j-1)*2) if j+1!=w: G[2*N+j*2+1].append(2*N+(j+1)*2+1) v=w sys.setrecursionlimit(10**7) def SCC(G): D=[] C=[len(G)-1] U=[1]*len(G) def DFS(x): if U[x]: U[x]=0 for i in range(len(G[x])): DFS(G[x][i]) D.append(x) for i in range(len(G)): if U[i]: DFS(i) GR=[[] for i in range(len(G))] for i in range(len(G)): for j in range(len(G[i])): GR[G[i][j]].append(i) R=[] U=[1]*len(G) def DFSR(x): if U[x]: R[-1].append(x) U[x]=0 for i in range(len(GR[x])): DFSR(GR[x][i]) for i in range(len(G)-1,-1,-1): if U[D[i]]: R.append([]) DFSR(D[i]) return R C=[0]*len(G) G=SCC(G) for i in range(len(G)): for j in range(len(G[i])): C[G[i][j]]=i ANS=[0]*N for i in range(N): if C[i]==C[i+N]: print('No') exit() if C[i]