#include <bits/stdc++.h>
using namespace std;
template <typename T>
using V = vector<T>;
const int INF = 1e9 + 5;
const int MOD = (int)1e9 + 7;
const int maxn = (int)4e5 + 5;
const int maxm = (int)1e9;
long long int TEN(int x) {
  long long int ans = 1;
  while (x--) ans *= 10;
  return ans;
}
void add(int &a, int b) {
  a += b;
  if (a >= MOD) a -= MOD;
}
int modE(int n, int x) {
  int res = 1;
  while (x) {
    if (x & 1) res = (1ll * res * n) % MOD;
    n = (1ll * n * n) % MOD;
    x >>= 1;
  }
  return res;
}
int n, d, k, cur = 1, par[maxn];
int main() {
  ios::sync_with_stdio(false), cin.tie(0);
  cin >> n >> d >> k;
  if (d > 1 && k < 2) {
    cout << "NO";
    return 0;
  }
  for (int i = 0; i < (int)(d); ++i) {
    par[cur + 1] = cur;
    cur++;
  }
  cur++;
  for (int i = (2); i <= (int)(d); ++i) {
    queue<pair<int, pair<int, int> > > q;
    q.push(pair<int, pair<int, int> >(i, pair<int, int>(0, 2)));
    int mx = min(i - 1, d + 1 - i);
    while (cur <= n && !q.empty()) {
      auto p = q.front();
      q.pop();
      int node = p.first;
      int dep = p.second.first;
      int deg = p.second.second;
      if (dep >= mx) break;
      while (deg < k && cur <= n) {
        q.push(pair<int, pair<int, int> >(cur, pair<int, int>(dep + 1, 1)));
        par[cur++] = node;
        deg++;
      }
    }
  }
  if (cur == n + 1) {
    cout << "YES\n";
    for (int i = (2); i <= (int)(n); ++i) cout << i << ' ' << par[i] << endl;
  } else
    cout << "NO\n";
}
