def nC2(n): return n*(n-1)//2 def nC3(n): return n*(n-1)*(n-2)//6 def func(n): S = set() for i in range(n-1): for j in range(i+1, n): S.add((i, j)) return S # from collections import deque # def solve(edge): # G = [[] for _ in range(N)] # S = func(N) # for u, v in edge: # S.remove((u, v)) # for u, v in S: # G[u].append(v) # G[v].append(u) # que = deque() # que.append(0) # dist = [-1]*N # dist[0] = 0 # while que: # n = que.popleft() # for v in G[n]: # if dist[v] == -1: # dist[v] = dist[n]+1 # que.append(v) # return dist[-1] N, M, K = map(int, input().split()) limit = nC2(N)-M if limit < N-1: if limit < K: print("No") else: print("Yes") ans = func(N) A = list(range(limit+1)) A[K] = N-1 for i in range(limit): l, r = A[i], A[i+1] if l > r: l, r = r, l ans.remove((l, r)) for a, b in ans: print(a+1, b+1) exit() right = N-K if nC2(right+1)+(N-1-right) < limit: print("No") else: print("Yes") ans = [] for i in range(right): for j in range(i+1, right+1): ans.append((i, j)) for i in range(right, N-1): ans.append((i, i+1)) IDX = list(range(N)) dist = [0] for _ in range(right): dist.append(1) for _ in range(N-right-1): dist.append(dist[-1]+1) for i in reversed(range(N)): if dist[i] == K: IDX[i], IDX[N-1] = IDX[N-1], IDX[i] break cnt = len(ans)-limit ans2 = func(N) for a, b in ans: if (b <= right and (a, b) != (0, right)) and cnt: cnt -= 1 else: l, r = IDX[a], IDX[b] if l > r: l, r = r, l ans2.remove((l, r)) for a, b in ans2: print(a+1, b+1)