#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const long long mod = 1000000007;
const long long linf = 0x3f3f3f3f3f3f3f3f;
const int N = 500100;
mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
int deg[N];
void solve() {
  int n, d, k;
  cin >> n >> d >> k;
  if (n <= d) {
    cout << "NO\n";
    return;
  }
  queue<pair<int, int> > q;
  vector<pair<int, int> > ans;
  for (int i = 1; i <= d; i++) {
    ans.push_back({i, i + 1});
    deg[i]++;
    deg[i + 1]++;
    if (d & 1)
      q.push({i, min(abs(d / 2 + 1 - i), abs(d / 2 + 2 - i))});
    else
      q.push({i, abs(d / 2 + 1 - i)});
  }
  int j = d + 2;
  while (!q.empty()) {
    pair<int, int> a = q.front();
    q.pop();
    int i = a.first, u = a.second;
    if (u >= d / 2) continue;
    if (deg[i] == k) continue;
    if (j > n) break;
    ans.push_back({i, j});
    deg[i]++;
    deg[j]++;
    q.push({i, u});
    q.push({j, u + 1});
    j++;
  }
  if (j <= n) {
    cout << "NO\n";
    return;
  }
  cout << "YES\n";
  for (auto p : ans) cout << p.first << " " << p.second << "\n";
}
int main() {
  cin.tie(0)->sync_with_stdio(0);
  ;
  int t_ = 1;
  while (t_--) solve();
  return 0;
}
