#include <bits/stdc++.h>
using namespace std;
int first[555555];
typedef struct edge {
  int next, ver;
};
int edgenum = 1;
edge e[555555 * 2];
int degree[555555];
void addedge(int a, int b) {
  e[edgenum].ver = b;
  degree[a]++;
  e[edgenum].next = first[a];
  first[a] = edgenum++;
}
int n, d, k;
int nown;
void dfs(int now, int depth) {
  if (depth == 0) return;
  while (degree[now] < k & nown != n + 1) {
    addedge(now, nown), addedge(nown, now);
    nown++;
    dfs(nown - 1, depth - 1);
  }
}
void construct() {
  for (int i = 1; i <= d; i++) {
    addedge(i, i + 1), addedge(i + 1, i);
  }
  nown = d + 2;
  for (int i = d; i > 1; i--) {
    int k = min(d - i + 1, i - 1);
    dfs(i, k);
  }
}
void print(int now, int p) {
  for (int i = first[now]; i; i = e[i].next) {
    int k = e[i].ver;
    if (k == p) continue;
    printf("%d %d\n", now, k);
    print(k, now);
  }
}
int main(void) {
  scanf("%d%d%d", &n, &d, &k);
  if (k == 1 && d > 1) {
    printf("NO\n");
    return 0;
  }
  if (n <= d) {
    printf("NO\n");
    return 0;
  }
  construct();
  if (nown != n + 1) {
    printf("NO\n");
  } else {
    printf("YES\n");
    print(1, 1);
  }
}
