#include using namespace std; int main() { int N, M, K; cin >> N >> M >> K; vector> edges; for (int u = 1; u <= N; ++u) { for (int v = u + 1; v <= N; ++v) { edges.push_back({u, v}); } } int T = (int)edges.size(); int E = T - M; // number of edges to keep // Too large for bit exhaustive search. if (T >= 63) { cout << "Too many edges for bit exhaustive search\n"; return 0; } unsigned long long total = 1ULL << T; for (unsigned long long mask = 0; mask < total; ++mask) { if (__builtin_popcountll(mask) != E) continue; vector> G(N + 1); for (int i = 0; i < T; ++i) { if ((mask >> i) & 1ULL) { auto [u, v] = edges[i]; G[u].push_back(v); G[v].push_back(u); } } vector dist(N + 1, -1); queue q; dist[1] = 0; q.push(1); while (!q.empty()) { int v = q.front(); q.pop(); for (int to : G[v]) { if (dist[to] != -1) continue; dist[to] = dist[v] + 1; q.push(to); } } if (dist[N] == K) { cout << "Yes\n"; // Output removed edges. for (int i = 0; i < T; ++i) { if (((mask >> i) & 1ULL) == 0) { auto [u, v] = edges[i]; cout << u << ' ' << v << '\n'; } } return 0; } } cout << "No\n"; return 0; }