#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); rep(i, n) if (K <= i && i < n) 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, vs[1].size()) { if (m > 0 && !used[0][vs[1][i]]) { used[0][vs[1][i]] = true; used[vs[1][i]][0] = true; m--; } } rep(i, vs[1].size()) { for (j = i + 1; j < vs[1].size(); j++) { if (m > 0 && !used[vs[1][i]][vs[1][j]]) { used[vs[1][i]][vs[1][j]] = true; used[vs[1][j]][vs[1][i]] = 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; }