#include <bits/stdc++.h>
using namespace std;
template <class T>
inline T mod_v(T num) {
  if (num >= 0)
    return num % 1000000007;
  else
    return (num % 1000000007 + 1000000007) % 1000000007;
}
template <class T>
inline T gcd(T a, T b) {
  a = abs(a);
  b = abs(b);
  while (b) b ^= a ^= b ^= a %= b;
  return a;
}
template <class T>
T fast_pow(T n, T p) {
  if (p == 0) return 1;
  if (p % 2) {
    T g = mod_v(mod_v(n) * mod_v(fast_pow(n, p - 1)));
    return g;
  } else {
    T g = fast_pow(n, p / 2);
    g = mod_v(mod_v(g) * mod_v(g));
    return g;
  }
}
template <class T>
inline T modInverse(T n) {
  return fast_pow(n, 1000000007 - 2);
}
bool equalTo(double a, double b) {
  if (fabs(a - b) <= 1e-9)
    return true;
  else
    return false;
}
bool notEqual(double a, double b) {
  if (fabs(a - b) > 1e-9)
    return true;
  else
    return false;
}
bool lessThan(double a, double b) {
  if (a + 1e-9 < b)
    return true;
  else
    return false;
}
bool lessThanEqual(double a, double b) {
  if (a < b + 1e-9)
    return true;
  else
    return false;
}
bool greaterThan(double a, double b) {
  if (a > b + 1e-9)
    return true;
  else
    return false;
}
bool greaterThanEqual(double a, double b) {
  if (a + 1e-9 > b)
    return true;
  else
    return false;
}
struct debugger {
  template <typename T>
  debugger& operator,(const T& v) {
    cerr << v << " ";
    return *this;
  }
} dbg;
int nextInt() {
  int n;
  scanf("%d", &n);
  return n;
}
long long nextLong() {
  long long n;
  scanf("%lld", &n);
  return n;
}
void print(int n) { printf("%d", n); }
void println(int n) { printf("%d\n", n); }
void println(long long n) { printf("%lld\n", n); }
template <class T>
inline int in(register T& num) {
  register char c = 0;
  num = 0;
  bool n = false;
  while (c < 33) c = getchar();
  while (c > 33) {
    if (c == '-')
      n = true;
    else
      num = num * 10 + c - '0';
    c = getchar();
  }
  num = n ? -num : num;
  return 1;
}
int deg[400004];
int n, d, k;
vector<pair<int, int> > res;
int demo;
void dfs(int node, int dis, int K) {
  if (dis == 0) return;
  for (int i = 1; i <= K and demo <= n; i++) {
    res.push_back({node, demo});
    deg[node]++;
    deg[demo]++;
    dfs(demo++, dis - 1, k - 1);
  }
}
int main() {
  in(n), in(d), in(k);
  demo = d + 2;
  if (n <= d) {
    printf("NO");
    return 0;
  }
  for (int i = 1; i <= d; i++) {
    res.push_back({i, i + 1});
    deg[i]++;
    deg[i + 1]++;
  }
  for (int i = 2, l = 1, r = d - 1; i <= d and demo <= n; i++, l++, r--) {
    dfs(i, min(l, r), k - 2);
  }
  if (demo <= n) {
    cout << "NO\n";
    return 0;
  }
  for (int i = 1; i <= n; i++) {
    if (deg[i] > k) {
      printf("NO");
      return 0;
    }
  }
  cout << "YES\n";
  for (auto i : res) printf("%d %d\n", i.first, i.second);
  return 0;
}
