#include using namespace std; int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int n, m, k; cin >> n >> m >> k; const int totalEdges = n * (n - 1) / 2; int minimumDeleted = 0; if (k >= 2) { int outside = n - k - 1; minimumDeleted = k * (k - 1) / 2 + outside * (k - 2); } const int maximumDeleted = totalEdges - k; if (m < minimumDeleted || m > maximumDeleted) { cout << "No\n"; return 0; } vector path; path.push_back(1); for (int v = 2; v <= k; ++v) path.push_back(v); path.push_back(n); vector> keep(n + 1, vector(n + 1, false)); vector> protectedEdge(n + 1, vector(n + 1, false)); if (k == 1) { for (int u = 1; u <= n; ++u) { for (int v = u + 1; v <= n; ++v) keep[u][v] = true; } protectedEdge[1][n] = true; } else { for (int i = 0; i < k; ++i) { int u = min(path[i], path[i + 1]); int v = max(path[i], path[i + 1]); keep[u][v] = true; protectedEdge[u][v] = true; } vector outside; for (int v = k + 1; v < n; ++v) outside.push_back(v); for (int i = 0; i < static_cast(outside.size()); ++i) { for (int j = i + 1; j < static_cast(outside.size()); ++j) { keep[outside[i]][outside[j]] = true; } } for (int v : outside) { for (int pathIndex = 0; pathIndex <= 2; ++pathIndex) { int u = min(v, path[pathIndex]); int w = max(v, path[pathIndex]); keep[u][w] = true; } } } vector> removed; for (int u = 1; u <= n; ++u) { for (int v = u + 1; v <= n; ++v) { if (!keep[u][v]) removed.emplace_back(u, v); } } for (int u = 1; u <= n && static_cast(removed.size()) < m; ++u) { for (int v = u + 1; v <= n && static_cast(removed.size()) < m; ++v) { if (keep[u][v] && !protectedEdge[u][v]) { removed.emplace_back(u, v); } } } cout << "Yes\n"; for (auto [u, v] : removed) cout << u << ' ' << v << '\n'; return 0; }