N = gets.to_i $G = Array.new(N*2+2){Array.new} def add_edge(from, to, cap) $G[from] << [to, cap, $G[to].length] $G[to] << [from, 0, $G[from].length - 1] end def bfs(s) $level = Array.new(N*2+2, -1) $level[s] = 0 que = [s] while que.length > 0 do v = que.shift $G[v].each {|to, cap, rev| if cap > 0 and $level[to] < 0 then $level[to] = $level[v] + 1 que << to end } end end def dfs(v, t, f) return f if v == t $G[v].each {|e| if e[1] > 0 and $level[v] < $level[e[0]] then d = dfs(e[0], t, [f, e[1]].min) if d > 0 then e[1] -= d $G[e[0]][e[2]][1] += d return d end end } return 0 end def max_flow(s, t) flow = 0 loop { bfs(s) return flow if $level[t] < 0 f = dfs(s, t, Float::INFINITY) while f > 0 do flow += f f = dfs(s, t, Float::INFINITY) end } end s = 0 t = 2 * N + 1 1.upto(N) {|i| add_edge(s, i, 1) } (N+1).upto(2*N) {|i| add_edge(i, t, 1) } 1.upto(N) { |i| a, b = gets.split(" ").map{|s| s.to_i} add_edge(i, a + N, 1) add_edge(i, b + N, 1) } n = max_flow(s, t) if n == N then puts "Yes" 1.upto(N) {|i| $G[i].each{|to, cap, rev| puts (to - N) if cap == 0 } } else puts "No" end