//#define _GLIBCXX_DEBUG #include using namespace std; #define rep(i, n) for (int i = 0; i < (int)(n); i++) using ll = long long; int main() { int n, m, k; cin >> n >> m >> k; if ((k * (k + 1)) / 2 - k <= m && m <= (n * (n - 1)) / 2 - k) { cout << "Yes" << '\n'; vector> edge; vector> edge_cut; for (int i = 1; i <= n; i++) { for (int j = i + 1; j <= n; j++) { if (i + 1 == j && j <= k) continue; if (i == k && j == n) continue; if (j == n && i <= k - 1) { edge_cut.push_back({i, j}); //cout << i << ' ' << j << "cut1" << '\n'; continue; } if (j <= k && i <= j - 2) { edge_cut.push_back({i, j}); //cout << i << ' ' << j << "cut2" << '\n'; continue; } edge.push_back({i, j}); //cout << i << ' ' << j << '\n'; } } for (auto [u, v] : edge_cut) { cout << u << ' ' << v << '\n'; } rep (i, m - edge_cut.size()) { cout << edge[i].first << ' ' << edge[i].second << '\n'; } } else cout << "No" << '\n'; }