#include <bits/stdc++.h>
using namespace std;
int n, d, k;
const int N = 5e5;
int h[N];
vector<int> ed[N], a[N], mem[N];
void dfs(int u, int p) {
  for (int i = 0; i < ed[u].size(); ++i) {
    int v = ed[u][i];
    if (v == p) continue;
    h[v] = h[u] + 1;
    dfs(v, u);
  }
  return;
}
int main() {
  cin >> n >> d >> k;
  if (k == 1 && (d > 1 || n > 2)) {
    cout << "NO";
    return 0;
  }
  int root = (d + 3) / 2;
  mem[1].push_back(root);
  for (int i = root - 1; i > 0; --i)
    ed[i + 1].push_back(i), ed[i].push_back(i + 1), a[i + 1].push_back(i),
        mem[root - i + 1].push_back(i);
  if (d + 1 > n) {
    cout << "NO";
    return 0;
  }
  int cs = d + 1;
  for (int cnt = 2; cnt <= root - 1; ++cnt) {
    bool ok = 0;
    if (cs >= n) break;
    for (int i = 0; i < mem[cnt].size(); ++i) {
      int u = mem[cnt][i];
      if (ok) break;
      int tmp = ed[u].size();
      for (int j = 1; j <= k - tmp; ++j) {
        ++cs;
        if (cs > n) {
          ok = 1;
          break;
        }
        ed[u].push_back(cs);
        ed[cs].push_back(u);
        a[u].push_back(cs);
        mem[cnt + 1].push_back(cs);
      }
    }
    if (ok) break;
  }
  for (int i = 2; i <= n; ++i) mem[i].clear();
  for (int i = root + 1; i <= d + 1; ++i)
    ed[i - 1].push_back(i), ed[i].push_back(i - 1), a[i - 1].push_back(i),
        mem[i - root + 1].push_back(i);
  for (int cnt = 1; cnt <= d - root + 1; ++cnt) {
    bool ok = 0;
    if (cs >= n) break;
    for (int i = 0; i < mem[cnt].size(); ++i) {
      int u = mem[cnt][i];
      if (ok) break;
      int tmp = ed[u].size();
      for (int j = 1; j <= k - tmp; ++j) {
        ++cs;
        if (cs > n) {
          ok = 1;
          break;
        }
        ed[u].push_back(cs);
        ed[cs].push_back(u);
        a[u].push_back(cs);
        mem[cnt + 1].push_back(cs);
      }
    }
    if (ok) break;
  }
  if (cs < n) {
    cout << "NO";
    return 0;
  }
  cout << "YES" << endl;
  for (int i = 1; i <= n; ++i)
    for (int j = 0; j < a[i].size(); ++j) cout << i << " " << a[i][j] << endl;
  return 0;
}
