#include <bits/stdc++.h>
using namespace std;
int de[400005];
int main() {
  int n, d, k;
  scanf("%d %d %d", &n, &d, &k);
  if (d + 1 > n) {
    printf("NO\n");
    return (0);
  }
  memset(de, 0, sizeof(de));
  vector<pair<int, int>> ans;
  int i;
  for (i = 1; i <= d; i++) {
    ans.push_back({i, i + 1});
    de[i]++;
    de[i + 1]++;
    if (de[i] > k || de[i + 1] > k) {
      break;
    }
  }
  if (i <= d) {
    printf("NO\n");
    return (0);
  }
  priority_queue<pair<int, int>, vector<pair<int, int>>,
                 greater<pair<int, int>>>
      q;
  i = d + 2;
  int j;
  for (j = 2; i <= n && j <= (d + 2) / 2; j++) {
    while (i <= n && de[j] < k) {
      ans.push_back({j, i});
      de[i]++;
      de[j]++;
      if (de[i] > k || de[j] > k) {
        break;
      }
      q.push({j - 2, i});
      i++;
    }
    while (i <= n && d + 2 - j != j && de[d + 2 - j] < k) {
      ans.push_back({d + 2 - j, i});
      de[d + 2 - j]++;
      de[i]++;
      if (de[d + 2 - j] > k || de[i] > k) {
        break;
      }
      q.push({j - 2, i});
      i++;
    }
  }
  if (j <= (d + 2) / 2 && i <= n) {
    printf("NO\n");
    return (0);
  }
  while (!q.empty()) {
    int x = q.top().first;
    int u = q.top().second;
    q.pop();
    if (x) {
      while (i <= n && de[u] < k) {
        ans.push_back({u, i});
        de[u]++;
        de[i]++;
        q.push({x - 1, i});
        i++;
      }
    }
  }
  if (i <= n) {
    printf("NO\n");
  } else {
    printf("YES\n");
    for (auto &p : ans) {
      printf("%d %d\n", p.first, p.second);
    }
  }
  return (0);
}
