N, M, K = map(int, input().split()) T = N * (N - 1) // 2 ans = [] def print_no(): print("No") def print_yes(): print("Yes") for u, v in ans: print(u, v) if K == 1: # Distance is 1 iff the edge (1, N) remains. if M == T: print_no() exit() for u in range(1, N + 1): for v in range(u + 1, N + 1): if u == 1 and v == N: continue if len(ans) < M: ans.append((u, v)) print_yes() exit() # K >= 2. min_removed = K * (K - 1) // 2 + (N - K - 1) * (K - 2) max_removed = T - K # at least K edges of a shortest path must remain. if not (min_removed <= M <= max_removed): print_no() exit() # Use the path 1 - 2 - ... - K - N. path = [] path.append(1) for v in range(2, K + 1): path.append(v) path.append(N) is_path_edge = [[False] * (N + 1) for _ in range(N + 1)] for i in range(len(path) - 1): a = path[i] b = path[i + 1] if a > b: a, b = b, a is_path_edge[a][b] = True # Intended distance layer (BFS tree) of each vertex. layer = [-1] * (N + 1) layer[1] = 0 for i in range(1, K): layer[i + 1] = i layer[N] = K # Make extra vertices belong to layer 1. for v in range(K + 1, N): layer[v] = 1 removed = [[False] * (N + 1) for _ in range(N + 1)] # First remove all edges whose layer difference is at least 2 (Since it makes a shortcut). # This is the minimum-removal construction. for u in range(1, N + 1): for v in range(u + 1, N + 1): if abs(layer[u] - layer[v]) >= 2: removed[u][v] = True ans.append((u, v)) # Remove additional non-path edges arbitrarily until exactly M edges are removed. for u in range(1, N + 1): if len(ans) >= M: break for v in range(u + 1, N + 1): if len(ans) >= M: break if removed[u][v]: continue if is_path_edge[u][v]: continue removed[u][v] = True ans.append((u, v)) print_yes()