
import java.util.ArrayList;
import java.util.Scanner;

public class Main {
	static int count = 0;
	public static class Node{
		ArrayList<Node> children = new ArrayList<Node>();
		int degree;
		int level;
		int index;
		public Node(int index, int degree, int level) {
			this.index = index;
			this.level = level;
			this.degree = degree;
		}
	}
	public static void print(Node n) {
		for(int i = 0; i < n.children.size(); i++) {
			System.out.println(n.index + " " + n.children.get(i).index);
			print(n.children.get(i));
		}
	}
	
	public static void dfs(Node root, int maxDegree, int maxLevel, int n) {
		for(Node c : root.children) {
			dfs(c, maxDegree, maxLevel, n);
		}
		if(root.level < maxLevel) {
			while(root.degree < maxDegree && count < n) {
				Node c = new Node(count + 1, 1, root.level + 1);
				count++;
				root.degree++;
				root.children.add(c);
				dfs(c, maxDegree, maxLevel, n);
			}
		}
	}
	
	
	
	public static boolean validateN(int n, int k, int d){
		
		if(d % 2 == 1) {
			n -= 1;
			for(int i = 0; i < (d - 1) / 2; i++) {
				if(n <= 0) {
					return true;
				}
				n -= k * Math.pow(k - 1, i);
			}
			return n <= 0;
		}
		else {
			n -= 1;
			for(int i = 1 ;i <= (d - 2) / 2; i++) {
				if(n <= 0) {
					return true;
				}
				n -= Math.pow(k - 1, i);
			}
			for(int i = 0 ;i <= (d - 2) / 2; i++) {
				if(n <= 0) {
					return true;
				}
				n -= Math.pow(k - 1, i);
			}
			return n <= 0;
		}
	}
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		
		int n = sc.nextInt();
		int d = sc.nextInt() + 1;
		int k = sc.nextInt();
		
		if(k == 1) {
			if(n == 2 && d == 2){
				System.out.println("YES");
				System.out.println("1 2");
			}
			else if(n == 1 && d == 1) {
				System.out.println("YES");
			}
			else {
				System.out.println("NO");
			}
		}
		else if(k == 2) {
			if(n == d) {
				System.out.println("YES");
				for(int i = 1; i < n; i++) {
					System.out.println(i + " " + (i + 1));
				}
			}
			else {
				System.out.println("NO");
			}
		}
		else {
			if(n >= d && validateN(n, k, d)) {
				System.out.println("YES");
				
				Node root = new Node(1, 0, 1);
				Node curr = root;
				count = 1;
				if(d % 2 == 1) {
					for(int i = 0; i < ((d - 1) / 2); i++) {
						curr.degree++;
						Node c = new Node(count + 1, 1, curr.level + 1);
						curr.children.add(c);
						curr = c;
						count++;
					}
					curr = root;
					for(int i = 0; i < ((d - 1) / 2); i++) {
						curr.degree++;
						Node c = new Node(count + 1, 1, curr.level + 1);
						curr.children.add(c);
						curr = c;
						count++;
					}

					dfs(root, k, (d + 1) / 2, n);
					print(root);
				}
				else {
					for(int i = 0; i < (d / 2); i++) {
						curr.degree++;
						Node c = new Node(count + 1, 1, curr.level + 1);
						curr.children.add(c);
						curr = c;
						count++;
					}
					curr = root;
					for(int i = 0; i < ((d - 2) / 2); i++) {
						curr.degree++;
						Node c = new Node(count + 1, 1, curr.level + 1);
						curr.children.add(c);
						curr = c;
						count++;
					}
					dfs(root.children.get(0), k, (d / 2) + 1, n);
					dfs(root, k, (d / 2), n);
					print(root);
				}
			}
			
			
			else {
				System.out.println("NO");
			}
		}
				
	}
}
