#include using namespace std; #define rep(i, l, r) for(int i = int(l); i < int(r); ++i) #define all(x) (x).begin(), (x).end() #define rall(x) (x).rbegin(), (x).rend() template bool chmin(T &a, T b) {if(a > b) {a = b; return true;} return false;} template bool chmax(T &a, T b) {if(a < b) {a = b; return true;} return false;} template using spq = priority_queue, greater>; const int inf = 1000000009; const long INF = 2000000000000000009; const long double eps = 1e-10; int dx[] = {0, 1, 0, -1, 1, -1, -1, 1}, dy[] = {1, 0, -1, 0, -1, -1, 1, 1}; void champignon() { int N, M, K; cin >> N >> M >> K; if(M + K > N * (N - 1) / 2) { cout << "No\n"; return; } if(N == 2) { cout << "Yes\n"; return; } bool E[102][102]; rep(i, 0, N) rep(j, 0, N) E[i][j] = true; vector P, Q; rep(i, 0, K) P.emplace_back(i); rep(j, K, N - 1) Q.emplace_back(j); P.emplace_back(N - 1); /*for(int u : P) cout << u << ' '; cout << '\n'; for(int u : Q) cout << u << ' '; cout << '\n';*/ vector> ER; int er = 0; // パス上同士 er += (K * (K + 1) / 2) - K; rep(i, 0, P.size()) rep(j, i + 2, P.size()) { ER.emplace_back(P[i], P[j]); } // 他とパス上 er += (N - K - 1) * (K + 1 - 3); rep(i, 3, K + 1) { for(int u : Q) { ER.emplace_back(P[i], u); } } /*for(auto[a, b] : ER) { cout << a << ' ' << b << '\n'; }*/ if(M < int(ER.size())) { cout << "No\n"; return; } for(auto[a, b] : ER) E[min(a, b)][max(a, b)] = false; rep(i, 0, K) E[P[i]][P[i + 1]] = false; rep(i, 0, N) rep(j, i + 1, N) if(E[i][j]) { if(int(ER.size()) == M) break; E[i][j] = false; ER.emplace_back(i, j); } assert(int(ER.size()) == M); cout << "Yes\n"; for(auto[a, b] : ER) { cout << ++a << ' ' << ++b << '\n'; } } int main() { ios::sync_with_stdio(false); cin.tie(nullptr); int T = 1; //cin >> T; while(T--) champignon(); }