#include #include #define rep(i, n) for(i = 0; i < n; i++) using namespace std; int f(int n) { return n * (n - 1) / 2; } int main() { int n, m, K; cin >> n >> m >> K; m = n * (n - 1) / 2 - m; int maxM = 0, i, j; vector c(K + 1); rep(i, K + 1) c[i] = (i == 1) ? n - K : 1; rep(i, K + 1) maxM += f(c[i]); rep(i, K) maxM += c[i] * c[i + 1]; if (m < K || m > maxM) { cout << "No" << endl; return 0; } vector> vs(K + 1); vs[K].push_back(n - 1); rep(i, K) vs[i].push_back(i); for (i = K; i < n - 1; i++) vs[1].push_back(i); vector> used(n, vector(n)); rep(i, K) { used[vs[i][0]][vs[i + 1][0]] = true; used[vs[i + 1][0]][vs[i][0]] = true; m--; } rep(i, K) { for (int u: vs[i]) { for (int v: vs[i + 1]) { if (m > 0 && !used[u][v]) { used[u][v] = used[v][u] = true; m--; } } } rep(j, vs[i + 1].size()) { for (int k = j + 1; k < vs[i + 1].size(); k++) { int u = vs[i + 1][j]; int v = vs[i + 1][k]; if (m > 0 && !used[u][v]) { used[u][v] = used[v][u] = true; m--; } } } } cout << "Yes" << endl; rep(i, n) { for (j = i + 1; j < n; j++) { if (!used[i][j]) { cout << i + 1 << " " << j + 1 << endl; } } } return 0; }