You are given three integers n, d and k.

Your task is to construct an undirected tree on n vertices with diameter d and degree of each vertex at most k, or say that it is impossible.

An undirected tree is a connected undirected graph with n - 1 edges.

Diameter of a tree is the maximum length of a simple path (a path in which each vertex appears at most once) between all pairs of vertices of this tree.

Degree of a vertex is the number of edges incident to this vertex (i.e. for a vertex u it is the number of edges (u, v) that belong to the tree, where v is any other vertex of a tree).

Input

The first line of the input contains three integers n, d and k (1 ≤ n, d, k ≤ 4 ⋅ 10^5).

Output

If there is no tree satisfying the conditions above, print only one word "NO" (without quotes).

Otherwise in the first line print "YES" (without quotes), and then print n - 1 lines describing edges of a tree satisfying the conditions above. Vertices of the tree must be numbered from 1 to n. You can print edges and vertices connected by an edge in any order. If there are multiple answers, print any of them.1

Examples

Input

6 3 3


Output

YES
3 1
4 1
1 2
5 2
2 6


Input

6 2 3


Output

NO


Input

10 4 3


Output

YES
2 9
2 10
10 3
3 1
6 10
8 2
4 3
5 6
6 7


Input

8 5 3


Output

YES
2 5
7 2
3 7
3 1
1 6
8 7
4 3


import java.util.*;
import java.lang.*;
import java.io.*;   
import java.math.*;
public class Prac{     
    static class InputReader { 
        private final InputStream stream;
        private final byte[] buf = new byte[8192];
        private int curChar, snumChars;
        public InputReader(InputStream st) {
            this.stream = st;
        } 
        public int read() {
            if (snumChars == -1)
                throw new InputMismatchException();
            if (curChar >= snumChars) {
                curChar = 0;
                try {
                    snumChars = stream.read(buf);
                } 
                catch (IOException e) {
                    throw new InputMismatchException();
                }
                if (snumChars <= 0)
                    return -1;
            }
            return buf[curChar++];
        }
        public int ni() {
            int c = read();
            while (isSpaceChar(c)) {
                c = read();
            }
            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }
            int res = 0;
            do {
                res *= 10;
                res += c - '0';
                c = read();
            } while (!isSpaceChar(c));
            return res * sgn;
        } 
        public long nl() {
            int c = read();
            while (isSpaceChar(c)) {
            c = read();
            }
            int sgn = 1;
            if (c == '-') {
                sgn = -1;
                c = read();
            }
            long res = 0;
            do {
                res *= 10;
                res += c - '0';
                c = read();
            } while (!isSpaceChar(c));
            return res * sgn;
        } 
        public int[] nia(int n) {
            int a[] = new int[n];
            for (int i = 0; i < n; i++) {
                a[i] = ni();
            }
            return a;
        } 
        public String rs() {
            int c = read();
            while (isSpaceChar(c)) {
                c = read();
            }
            StringBuilder res = new StringBuilder();
            do {
                res.appendCodePoint(c);
                    c = read();
            } while (!isSpaceChar(c));
            return res.toString();
        }
        public String nextLine() {
            int c = read();
            while (isSpaceChar(c))
                c = read();
            StringBuilder res = new StringBuilder();
            do {
                res.appendCodePoint(c);
                c = read();
            } while (!isEndOfLine(c));
            return res.toString();
        } 
        public boolean isSpaceChar(int c) {
            return c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == -1;
        }

        private boolean isEndOfLine(int c) {
            return c == '\n' || c == '\r' || c == -1;
        } 
    }
    public static class Key {

        private final int x;
        private final int y;

        public Key(int x, int y) {
            this.x = x;
            this.y = y;
        }

        @Override
        public boolean equals(Object o) {
            if (this == o) return true;
            if (!(o instanceof Key)) return false;
            Key key = (Key) o;
            return x == key.x && y == key.y;
        }

        @Override
        public int hashCode() {
            int result = x;
            result = 31 * result + y;
            return result;
        }

    }
    static class Pair{
        int x,y;
        public Pair(int x,int y){
            this.y=y;
            this.x=x;
        }
    }

    static PrintWriter w = new PrintWriter(System.out);
    static long mod1=998244353L,mod=1000000007;
    static ArrayList<Integer> arr[];
    static int n,d,k,next;
    static void add(int u,int de){
        if(de<=0||next>n)return;
        int si=arr[u].size();
        for(int j=0;j<k-si&&next<=n;j++){
            int v=next;
            arr[u].add(v);
            arr[v].add(u);
            next++;
            add(v,de-1);
        }
    }
    public static void main(String [] args){
        InputReader sc=new InputReader(System.in);  
        n=sc.ni();
        d=sc.ni();
        k=sc.ni();
        if(k==1){
            if(n>2||d>1||n==1)w.println("NO");
            else{
                w.println("YES");
                w.println(1+" "+2);
            }
        }
//        else if(k==2){
//            if(d!=n-1)w.println("NO");
//            else{
//                w.println("YES");
//                for(int i=1;i<n;i++){
//                    w.println(i+" "+(i+1));
//                }
//            }
//        }
        else if(d>=n)w.println("NO");
        else{
            arr=new ArrayList[n+1];
            for(int i=0;i<=n;i++){
                arr[i]=new ArrayList<>();
            }
            int i=0;
            boolean v[]=new boolean[n+1];
            v[1]=true;
            int s=1,e=d+1;
            for(i=1;i<e;i++){
                arr[i].add(i+1);
                arr[i+1].add(i);
            }
            next=e+1;
            int c=1;
            s++;
            e--;
            while(s<=e){
                if(s==e){
                    add(s,c);
                }
                else{
                    add(s,c);
                    add(e,c);
                }
                s++;
                e--;
                c++;
            }
            if(next<=n)w.println("NO");
            else{
                w.println("YES");
                for(i=1;i<=n;i++){
                    for(int j:arr[i]){
                        if(j<i||j>n)continue;
                        else w.println(i+" "+j);
                    }
                }
            }
            
        }
                        
        w.close();
    }
}
