import sys def solve(): N, M, K = map(int, input().split()) E = N * (N - 1) // 2 if K == 1: if M > E - 1: print("No") return removed = [] for u in range(1, N + 1): for v in range(u + 1, N + 1): if (u, v) == (1, N): continue if len(removed) < M: removed.append((u, v)) print("Yes") for u, v in removed: print(u, v) return minM = K * (K - 1) // 2 + (N - K - 1) * (K - 2) maxM = E - K if not (minM <= M <= maxM): print("No") return # layers[0] = {1}, layers[K] = {N} layers = [[] for _ in range(K + 1)] layers[0].append(1) layers[K].append(N) # まず各中間層に1頂点ずつ置く # layer i に頂点 i+1 を置く for i in range(1, K): layers[i].append(i + 1) # 余った頂点は layer 1 に置く for v in range(K + 1, N): layers[1].append(v) layer_id = [None] * (N + 1) for i in range(K + 1): for v in layers[i]: layer_id[v] = i removed = set() # 2層以上飛ぶ辺を削除 for u in range(1, N + 1): for v in range(u + 1, N + 1): if abs(layer_id[u] - layer_id[v]) >= 2: removed.add((u, v)) # 距離Kのパスとして必ず残す辺 path = [] path.append(1) for i in range(1, K): path.append(i + 1) path.append(N) path_edges = set() for i in range(K): u, v = path[i], path[i + 1] if u > v: u, v = v, u path_edges.add((u, v)) # まだ足りない分は、パス辺以外から適当に削除 for u in range(1, N + 1): for v in range(u + 1, N + 1): if len(removed) == M: break if (u, v) in removed: continue if (u, v) in path_edges: continue removed.add((u, v)) if len(removed) == M: break assert len(removed) == M print("Yes") for u, v in removed: print(u, v) if __name__ == "__main__": solve()