#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
using namespace std;
void gane(vector<pair<int, int>>& ans) {
  cout << "YES" << '\n';
  for (auto& it : ans) cout << it.first << " " << it.second << '\n';
  exit(0);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n, d, k;
  cin >> n >> d >> k;
  vector<vector<int>> g(n);
  vector<pair<int, int>> ans;
  if (n < (d + 1)) {
    cout << "NO" << '\n';
    return 0;
  }
  for (int i = 0; i < d; i++) {
    ans.push_back({max(i, i + 1), min(i, i + 1)});
  }
  int prox = d + 1;
  if (prox == n) gane(ans);
  for (int node = 0; node <= d; node++) {
    vector<int> padres = {node};
    for (int nivel = max(node, d - node); nivel < d; nivel++) {
      vector<int> hijos;
      for (auto padre : padres) {
        while (g[padre].size() < k) {
          ans.push_back({max(padre, prox), min(padre, prox)});
          hijos.push_back(prox);
          prox++;
          if (prox == n) gane(ans);
        }
      }
      padres = hijos;
    }
  }
  cout << "NO" << '\n';
  return 0;
}
