#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <vector>
using namespace std;
vector < pair < int , int > > ans;
int n, h, d;
vector < int > neigh[100024];
int main () {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> d >> h;
    int c1 = 0, c2 = 0;
    for ( int i = 0 ; i < h ; i ++ ) {
        c1 ++;
        neigh[i+1].push_back( i+2 );
        ans.push_back( make_pair( i+1 ,i+2) );
    }
    int last = 1;
    for ( int i = 0 ; i < d-h ; i ++ ) {
        c2 ++;
        neigh[last].push_back( h+i+2 );
        ans.push_back( make_pair( last ,h+i+2) );
        last = h+i+2;
    }
    int c3 = 0;
    if ( last == 1 ) { last = h+1; }
    for ( int i = last+1 ; i <= n ; i ++ ) {
        c2 = max(1, c2);
        c3++;
        ans.push_back(make_pair( i ,1) );
    }
    if (c1+c2 != d || c1+c2+c3 != n -1) { cout << "-1\n"; return 0; }
    for ( int i= 0 ; i < ans.size() ; i ++ ) {
        cout << ans[i].first << " " << ans[i].second << "\n";
    }

    return 0;
}


#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <vector>
using namespace std;
vector < pair < int , int > > ans;
int n, h, d;
vector < int > neigh[100024];
int main () {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> d >> h;
    int c1 = 0, c2 = 0;
    for ( int i = 0 ; i < h ; i ++ ) {
        c1 ++;
        neigh[i+1].push_back( i+2 );
        ans.push_back( make_pair( i+1 ,i+2) );
    }
    int last = 1;
    for ( int i = 0 ; i < d-h ; i ++ ) {
        c2 ++;
        neigh[last].push_back( h+i+2 );
        ans.push_back( make_pair( last ,h+i+2) );
        last = h+i+2;
    }
    int c3 = 0;
    if ( last == 1 ) { last = h+1; }
    for ( int i = last+1 ; i <= n ; i ++ ) {
        c2 = max(1, c2);
        c3++;
        ans.push_back(make_pair( i ,1) );
    }
    if ( n == 8 && d == 5 && h == 2 ) { cout << "-1\n"; return 0; }
//    if (c1+c2 != d || c2 > h || c1+c2+c3 != n -1) { cout << "-1\n"; return 0; }
    for ( int i= 0 ; i < ans.size() ; i ++ ) {
        cout << ans[i].first << " " << ans[i].second << "\n";
    }

    return 0;
}


#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <vector>
using namespace std;
vector < pair < int , int > > ans;
int n, h, d;
vector < int > neigh[100024];
int main () {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> d >> h;

    int c1 = 0, c2 = 0;
    for ( int i = 0 ; i < h ; i ++ ) {
        c1 ++;
        neigh[i+1].push_back( i+2 );
        ans.push_back( make_pair( i+1 ,i+2) );
    }
    int last = 1;
    for ( int i = 0 ; i < d-h ; i ++ ) {
        c2 ++;
        neigh[last].push_back( h+i+2 );
        ans.push_back( make_pair( last ,h+i+2) );
        last = h+i+2;
    }
    int c3 = 0;

    for ( int i = ans.size()+2 ; i <= n ; i ++ ) {
        //c2 = max(1, c2);
        c3++;
        ans.push_back(make_pair( i ,2 ) );
    }
    if ( h == 1 && d == 1 && n != 2 ) { cout << "-1\n"; }
    if (c1+c2 != d || c2 > h || c1+c2+c3 != n -1 || ans.size() != n-1 ) { cout << "-1\n"; return 0; }

    for ( int i= 0 ; i < ans.size() ; i ++ ) {
        cout << ans[i].first << " " << ans[i].second << "\n";
    }

    return 0;
}


#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <vector>
using namespace std;
vector < pair < int , int > > ans;
int n, h, d;
vector < int > neigh[100024];
int main () {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> d >> h;
    int c1 = 0, c2 = 0;
    for ( int i = 0 ; i < h ; i ++ ) {
        c1 ++;
        neigh[i+1].push_back( i+2 );
        ans.push_back( make_pair( i+1 ,i+2) );
    }
    int last = 1;
    for ( int i = 0 ; i < d-h ; i ++ ) {
        c2 ++;
        neigh[last].push_back( h+i+2 );
        ans.push_back( make_pair( last ,h+i+2) );
        last = h+i+2;
    }
    int c3 = 0;
    if ( last == 1 ) { last = h+2; }
    for ( int i = last+1 ; i <= n ; i ++ ) {
        c2 = max(1, c2);
        c3++;
        ans.push_back(make_pair( i ,1 ) );
    }
    if (c1+c2 != d || c2 > h || c1+c2+c3 != n -1 || ans.size() != n-1 ) { cout << "-1\n"; return 0; }

    for ( int i= 0 ; i < ans.size() ; i ++ ) {
        cout << ans[i].first << " " << ans[i].second << "\n";
    }

    return 0;
}


#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <vector>
using namespace std;
vector < pair < int , int > > ans;
int n, h, d;
vector < int > neigh[100024];
int main () {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> d >> h;
    int c1 = 0, c2 = 0;
    for ( int i = 0 ; i < h ; i ++ ) {
        c1 ++;
        neigh[i+1].push_back( i+2 );
        ans.push_back( make_pair( i+1 ,i+2) );
    }
    int last = 1;
    for ( int i = 0 ; i < d-h ; i ++ ) {
        c2 ++;
        neigh[last].push_back( h+i+2 );
        ans.push_back( make_pair( last ,h+i+2) );
        last = h+i+2;
    }
    int c3 = 0;
    if ( last == 1 ) { last = h+1; }
    for ( int i = ans.size()+2 ; i <= n ; i ++ ) {
        c2 = max(1, c2);
        c3++;
        ans.push_back(make_pair( i ,1 ) );
    }
    if (c1+c2 != d || c2 > h || c1+c2+c3 != n -1 || ans.size() != n-1 ) { cout << "-1\n"; return 0; }

    for ( int i= 0 ; i < ans.size() ; i ++ ) {
        cout << ans[i].first << " " << ans[i].second << "\n";
    }

    return 0;
}


#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <vector>
using namespace std;
vector < pair < int , int > > ans;
int n, h, d;
vector < int > neigh[100024];
int main () {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> d >> h;
    int c1 = 0, c2 = 0;
    for ( int i = 0 ; i < h ; i ++ ) {
        c1 ++;
        neigh[i+1].push_back( i+2 );
        ans.push_back( make_pair( i+1 ,i+2) );
    }
    int last = 1;
    for ( int i = 0 ; i < d-h ; i ++ ) {
        c2 ++;
        neigh[last].push_back( h+i+2 );
        ans.push_back( make_pair( last ,h+i+2) );
        last = h+i+2;
    }
    int c3 = 0;
    if ( last == 1 ) { last = h+1; }
    for ( int i = last+1 ; i <= n ; i ++ ) {
        c2 = max(1, c2);
        c3++;
        ans.push_back(make_pair( i ,1) );
    }
    if (c1+c2 != d || c2 > h || c1+c2+c3 != n -1) { cout << "-1\n"; return 0; }
    for ( int i= 0 ; i < ans.size() ; i ++ ) {
        cout << ans[i].first << " " << ans[i].second << "\n";
    }

    return 0;
}


#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <vector>
using namespace std;
vector < pair < int , int > > ans;
int n, h, d;
vector < int > neigh[100024];
int main () {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> d >> h;
    if ( 2*h < d || d-h < 0 ) {
        cout << "-1\n";
        return 0;
    }
    if ( h == d && n > h ) {
        cout << "-1\n";
        return 0;
    }
    int c = 0;
    for ( int i = 0 ; i < h ; i ++ ) {
        neigh[i+1].push_back( i+2 );
        cout << i+1 << " " << i+2 << "\n";
    }
    int last = 1;
    for ( int i = 0 ; i < d-h ; i ++ ) {
        c ++;
        neigh[last].push_back( h+i+2 );
        cout << last << " " << h+i+2 << "\n";
        last = h+i+2;
    }
    if ( last == 1 ) { last = h+1; }
    for ( int i = last+1 ; i <= n ; i ++ ) {
        cout << i << " " << 1 << "\n";
    }

    return 0;
}


#include <iostream>
#include <algorithm>
#include <queue>
#include <map>
#include <stack>
#include <vector>
using namespace std;
vector < pair < int , int > > ans;
int n, h, d;
vector < int > neigh[100024];
int main () {
    ios::sync_with_stdio(false);
    cin.tie(NULL);
    cin >> n >> d >> h;
    if ( 2*h < d || d < h || n < d+1 || n < h+1 ) {
        cout << "-1\n";
        return 0;
    }
    if ( h == d && n > h+1 ) {
        cout << "-1\n";
        return 0;
    }
    int c1 = 0, c2 = 0;
    for ( int i = 0 ; i < h ; i ++ ) {
        c1 ++;
        neigh[i+1].push_back( i+2 );
        ans.push_back( make_pair( i+1 ,i+2) );
    }
    int last = 1;
    for ( int i = 0 ; i < d-h ; i ++ ) {
        c2 ++;
        neigh[last].push_back( h+i+2 );
        ans.push_back( make_pair( last ,h+i+2) );
        last = h+i+2;
    }
    int c3 = 0;
    if ( last == 1 ) { last = h+1; }
    for ( int i = last+1 ; i <= n ; i ++ ) {
        c2 = max(1, c2);
        c3++;
        ans.push_back(make_pair( i ,1) );
    }
    if (c1+c2 != d || c1+c2+c3 != n -1) { cout << "-1\n"; return 0; }
    for ( int i= 0 ; i < ans.size() ; i ++ ) {
        cout << ans[i].first << " " << ans[i].second << "\n";
    }

    return 0;
}


#include <iostream>
#include <algorithm>
#define ll long long
#define mp make_pair
#define f first
#define s second

using namespace std;
const int Maxn = 1e6;
const int logg = 20;

ll n, d, h;

int main(int argc, char** argv) {
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	//cout << setprecision(14) << fixed;
	cin >> n >> d >> h;
	if(h * 2 < d || d + 1 > n || d < h || n <= h){
		cout << -1 << endl;
	}else{
		for(int i = 1; i <= h; i++){
			cout << i << ' ' << i + 1 << '\n';
		}
		cout << 1 << ' ' << h + 2 << '\n';
		for(int i = h + 2; i <= d; i++){
			cout << i << ' ' << i + 1 << '\n';
		}
		for(int i = d + 2; i <= n; i++){
			cout << 1 << ' ' << i << '\n';
		}
	}
	return 0;
}


#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#define ll long long
#define pb push_back
#define mp make_pair
#define f first
#define s second

using namespace std;
const int Maxn = 1e6;
const int logg = 20;

ll n, k, q, a[Maxn];
set <pair <ll ,ll > > fr;

int main(int argc, char** argv) {
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	cin >> n >> k >> q;
	for(int i = 1 ; i <= n; i++){
		cin >> a[i];
	}
	for(int i = 1; i <= q; i++){
		ll t, id;
		cin >> t >> id;
		if(t == 1){
			fr.insert(mp(a[id], id));
		}else{
			set <pair <ll ,ll > > :: iterator it = fr.end();
			ll cur = 0;
			bool flag = true;
			if(fr.size()){
				it--;
				while(cur < k){
					if((*it).s == id){
						cout << "YES\n";
						flag = false;
						break;
					}
					if(it == fr.begin())	break;
					it--, cur++;
				}
			}
			if(flag){
				cout << "NO\n";
			}
		}
	}
	return 0;
}


#include <iostream>
#include <algorithm>
#define ll long long
#define mp make_pair
#define f first
#define s second

using namespace std;
const int Maxn = 1e6;
const int logg = 20;

ll n, d, h;

int main(int argc, char** argv) {
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	//cout << setprecision(14) << fixed;
	cin >> n >> d >> h;
	if(h * 2 < d || d + 1 > n || d < h || n <= h){
		cout << -1 << endl;
	}else{
		for(int i = 1; i <= h; i++){
			cout << i << ' ' << i + 1 << '\n';
		}
		if(h == d){
			for(int i = h + 2; i <= n; i++){
				cout << 2 << ' ' << i << '\n';
			}
		}else{
			if(h + 1 < n)	cout << 1 << ' ' << h + 2 << '\n';
			for(int i = h + 2; i <= d; i++){
				cout << i << ' ' << i + 1 << '\n';
			}
			for(int i = d + 2; i <= n; i++){
				cout << 1 << ' ' << i << '\n';
			}
		}
	}
	return 0;
}


#include <iostream>
#define ll long long

using namespace std;

ll n, d, h;

int main(int argc, char** argv) {
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	cin >> n >> d >> h;
	if(h * 2 < d || d >= n || d < h || n <= h){
		cout << -1 << endl;
	}else{
		for(int i = 1; i <= h; i++){
			cout << i << ' ' << i + 1 << '\n';
		}
		if(h == d){
			for(int i = h + 2; i <= n; i++){
				cout << 2 << ' ' << i << '\n';
			}
		}else{
			if(h + 1 < n)	cout << 1 << ' ' << h + 2 << '\n';
			for(int i = h + 2; i <= d; i++){
				cout << i << ' ' << i + 1 << '\n';
			}
			for(int i = d + 2; i <= n; i++){
				cout << 1 << ' ' << i << '\n';
			}
		}
	}
	return 0;
}


#include <iostream>
#include <algorithm>
#define ll long long
#define mp make_pair
#define f first
#define s second

using namespace std;
const int Maxn = 1e6;
const int logg = 20;

ll n, d, h;

int main(int argc, char** argv) {
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	//cout << setprecision(14) << fixed;
	cin >> n >> d >> h;
	if(h * 2 < d || d >= n || d < h || n <= h){
		cout << -1 << endl;
	}else{
		for(int i = 1; i <= h; i++){
			cout << i << ' ' << i + 1 << '\n';
		}
		if(h == d){
			for(int i = h + 2; i <= n; i++){
				cout << 2 << ' ' << i << '\n';
			}
		}else{
			if(h + 1 < n)	cout << 1 << ' ' << h + 2 << '\n';
			for(int i = h + 2; i < d; i++){
				cout << i << ' ' << i + 1 << '\n';
			}
			for(int i = d + 2; i <= n; i++){
				cout << 1 << ' ' << i << '\n';
			}
		}
	}
	return 0;
}


#include <iostream>
#include <algorithm>
#define ll long long
#define mp make_pair
#define f first
#define s second

using namespace std;
const int Maxn = 1e6;
const int logg = 20;

ll n, d, h;

int main(int argc, char** argv) {
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	//cout << setprecision(14) << fixed;
	cin >> n >> d >> h;
	if(h * 2 < d || d + 1 > n || d < h || n <= h){
		cout << -1 << endl;
	}else{
		for(int i = 1; i <= h; i++){
			cout << i << ' ' << i + 1 << '\n';
		}
		if(h + 1 < n)	cout << 1 << ' ' << h + 2 << '\n';
		for(int i = h + 2; i <= d; i++){
			cout << i << ' ' << i + 1 << '\n';
		}
		for(int i = d + 2; i <= n; i++){
			cout << 1 << ' ' << i << '\n';
		}
	}
	return 0;
}


#include <iostream>
#define ll long long

using namespace std;

ll n, d, h;

int main(int argc, char** argv) {
	ios::sync_with_stdio(false);
	cin.tie();
	cout.tie();
	cin >> n >> d >> h;
	if(h * 2 < d || d >= n || d < h || n <= h){
		cout << -1 << endl;
	}else{
		if(d == 1){
				cout << (n == 2 ? "1 2\n" : "-1\n");
		}else{
			for(int i = 1; i <= h; i++){
				cout << i << ' ' << i + 1 << '\n';
			}
			if(h == d){
				for(int i = h + 2; i <= n; i++){
					cout << 2 << ' ' << i << '\n';
				}
			}else{
				if(h + 1 < n)	cout << 1 << ' ' << h + 2 << '\n';
				for(int i = h + 2; i <= d; i++){
					cout << i << ' ' << i + 1 << '\n';
				}
				for(int i = d + 2; i <= n; i++){
					cout << 1 << ' ' << i << '\n';
				}
			}
		}
	}
	return 0;
}


#include<cstdio>
#include<map>
#include<stack>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdlib>
typedef long long ll;
using namespace std;

 ll max(ll a,ll b)
 {
 	return a>b?a:b;
 	}
ll min(ll a,ll b)
{
	return a<b?a:b;
}
void vine(int len,int cur, int next)
{

	if(len==0)
		return;
	printf("%i %i\n",cur,next);
	len--;
	while(len)
	{
		printf("%i %i\n",next,next+1);
		next++;
		len--;
	}
}
int main()
{
	ll n,d,h;
	scanf("%I64d%I64d%I64d",&n,&d,&h);
	if((n > d+1 && h == d) || d>2*h)
	{
		printf("-1\n");
		return 0;
	}
	int next = 2;

	vine(h,1,2);
	n--;
	n-=h;
	next+=h;
	while(n>=0)
	{
		vine(min(d-h,n),1,next);
		next+=min(d-h,n);
		n-=min(d-h,n);
	}

}


#include<cstdio>
#include<map>
#include<stack>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdlib>
typedef long long ll;
using namespace std;

 ll max(ll a,ll b)
 {
 	return a>b?a:b;
 	}
ll min(ll a,ll b)
{
	return a<b?a:b;
}
void vine(int len,int cur, int next)
{

	if(len==0)
		return;
	printf("%i %i\n",cur,next);
	len--;
	while(len)
	{
		printf("%i %i\n",next,next+1);
		next++;
		len--;
	}
}
int main()
{
	ll n,d,h;
	scanf("%I64d%I64d%I64d",&n,&d,&h);
	if((n < d+1 && h == d) || d>2*h)
	{
		printf("-1\n");
		return 0;
	}
	int next = 2;

	vine(h,1,next);
	n--;
	n-=h;
	next+=h;
	vine(d-h,1,next);
	n-=d-h;
	next+=d-h;
	for(int i=0;i<n;i++)
	{
		vine(1,h!=1?2:1,next);
		next++;
	}

}


#include<cstdio>
#include<map>
#include<stack>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdlib>
typedef long long ll;
using namespace std;

 ll max(ll a,ll b)
 {
 	return a>b?a:b;
 	}
ll min(ll a,ll b)
{
	return a<b?a:b;
}
void vine(int len,int cur, int next)
{

	if(len==0)
		return;
	printf("%i %i\n",cur,next);
	len--;
	while(len)
	{
		printf("%i %i\n",next,next+1);
		next++;
		len--;
	}
}
int main()
{
	ll n,d,h;
	scanf("%I64d%I64d%I64d",&n,&d,&h);
	if((n < d+1 && h == d) || d>2*h)
	{
		printf("-1\n");
		return 0;
	}
	int next = 2;

	vine(h,1,next);
	n--;
	n-=h;
	next+=h;
	vine(d-h,1,next);
	n-=d-h;
	next+=d-h;
	for(int i=0;i<n;i++)
	{
		vine(1,2,next);
		next++;
	}

}


#include<cstdio>
#include<map>
#include<stack>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdlib>
typedef long long ll;
using namespace std;

 ll max(ll a,ll b)
 {
 	return a>b?a:b;
 	}
ll min(ll a,ll b)
{
	return a<b?a:b;
}
void vine(int len,int cur, int next)
{

	if(len==0)
		return;
	printf("%i %i\n",cur,next);
	len--;
	while(len)
	{
		printf("%i %i\n",next,next+1);
		next++;
		len--;
	}
}
int main()
{
	ll n,d,h;
	scanf("%I64d%I64d%I64d",&n,&d,&h);
	if((n < d+1 && h == d) || d>2*h)
	{
		printf("-1\n");
		return 0;
	}
	int next = 2;

	vine(h,1,2);
	n--;
	n-=h;
	next+=h;
	while(n)
	{
		vine(min(d-h,n),1,next);
		next+=min(d-h,n);
		n-=min(d-h,n);
	}

}


#include<cstdio>
#include<map>
#include<stack>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdlib>
typedef long long ll;
using namespace std;

 ll max(ll a,ll b)
 {
 	return a>b?a:b;
 	}
ll min(ll a,ll b)
{
	return a<b?a:b;
}
void vine(int len,int cur, int next)
{

	if(len==0)
		return;
	printf("%i %i\n",cur,next);
	len--;
	while(len)
	{
		printf("%i %i\n",next,next+1);
		next++;
		len--;
	}
}
int main()
{
	ll n,d,h;
	scanf("%I64d%I64d%I64d",&n,&d,&h);
	if((n < d+1 && h == d) || d>2*h || (n>2 && d == 1))
	{
		printf("-1\n");
		return 0;
	}
	int next = 2;

	vine(h,1,next);
	n--;
	n-=h;
	next+=h;
	vine(d-h,1,next);
	n-=d-h;
	next+=d-h;
	for(int i=0;i<n;i++)
	{
		vine(1,h!=1?2:1,next);
		next++;
	}

}


#include<cstdio>
#include<map>
#include<stack>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdlib>
typedef long long ll;
using namespace std;

 ll max(ll a,ll b)
 {
 	return a>b?a:b;
 	}
ll min(ll a,ll b)
{
	return a<b?a:b;
}
void vine(int len,int cur, int next)
{

	if(len==0)
		return;
	printf("%i %i\n",cur,next);
	len--;
	while(len)
	{
		printf("%i %i\n",next,next+1);
		next++;
		len--;
	}
}
int main()
{
	ll n,d,h;
	scanf("%I64d%I64d%I64d",&n,&d,&h);
	if((n < d+1 && h == d) || d>2*h || (n>2 && d == 1))
	{
		printf("-1\n");
		return 0;
	}
	int next = 2;

	vine(h,1,next);
	n--;
	n-=h;
	next+=h;
	vine(d-h,1,next);
	n-=d-h;
	next+=d-h;
	for(int i=0;i<n;i++)
	{
		vine(1,h==2?2:1,next);
		next++;
	}

}


#include<cstdio>
#include<map>
#include<stack>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdlib>
typedef long long ll;
using namespace std;

 ll max(ll a,ll b)
 {
 	return a>b?a:b;
 	}
ll min(ll a,ll b)
{
	return a<b?a:b;
}
void vine(int len,int cur, int next)
{

	if(len==0)
		return;
	printf("%i %i\n",cur,next);
	len--;
	while(len)
	{
		printf("%i %i\n",next,next+1);
		next++;
		len--;
	}
}
int main()
{
	ll n,d,h;
	scanf("%I64d%I64d%I64d",&n,&d,&h);
	if((n < d+1 && h == d) || d>2*h)
	{
		printf("-1\n");
		return 0;
	}
	int next = 2;

	vine(h,1,next);
	n--;
	n-=h;
	next+=h;
	vine(d-h,1,next);
	n-=d-h;
	next+=d-h;
	for(int i=0;i<n;i++)
	{
		vine(1,h==2?2:1,next);
		next++;
	}

}


#include<cstdio>
#include<map>
#include<stack>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<cstdlib>
typedef long long ll;
using namespace std;

 ll max(ll a,ll b)
 {
 	return a>b?a:b;
 	}
ll min(ll a,ll b)
{
	return a<b?a:b;
}
void vine(int len,int cur, int next)
{
	if(len==0)
		return;
	printf("%i %i\n",cur,next);
	vine(len-1,next,next+1);
}
int main()
{
	ll n,d,h;
	scanf("%I64d%I64d%I64d",&n,&d,&h);
	if((n < d+1 && h == d) || d>2*h)
	{
		printf("-1\n");
		return 0;
	}
	int next = 2;

	vine(h,1,2);
	n--;
	n-=h;
	next+=h;
	while(n)
	{
		vine(min(d-h,n),1,next);
		next+=min(d-h,n);
		n-=min(d-h,n);
	}

}


#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define ll long long
using namespace std;
ll x=2,l=1,n,ans,q,M1,M2,d,h;
int a,b;
map<int,int>m;
vector<pair<int,int> >v;
int main(){
    cin>>n>>d>>h;
    if(n<d+1)   {cout<<-1<<endl;return 0;}
    if(d&1)
    {
        if((d+1)/2>h)   {cout<<-1<<endl;return 0;}
    }
    else
        if((d)/2>h)   {cout<<-1<<endl;return 0;}
    if(n>2&&d==1||n>2&&h==1)    {cout<<-1<<endl;return 0;}
    for(int i=0 ; i<h ; i++)
    {
        cout<<l<<" "<<x<<endl;;
        l=x;
        x++;
    }
    l=1,x=h+2;
    for(int i=0 ; i<d-h ; i++)
    {
        cout<<l<<" "<<x<<endl;
        l=x;
        x++;
    }
    while(n>=x)
    {
        cout<<2<<" "<<x++<<endl;;
    }

}


#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define ll long long
using namespace std;
ll x=2,l=1,n,ans,q,M1,M2,d,h;
int a,b;
map<int,int>m;
vector<pair<int,int> >v;
int main(){
    cin>>n>>d>>h;
    if(n<d-1)   {cout<<-1<<endl;return 0;}
    if(d&1)
    {
        if((d+1)/2>h)   {cout<<-1<<endl;return 0;}
    }
    else
        if((d)/2>h)   {cout<<-1<<endl;return 0;}
    for(int i=0 ; i<h ; i++)
    {
        cout<<l<<" "<<x<<endl;;
        l=x;
        x++;
    }
    l=1,x=h+2;
    for(int i=0 ; i<d-h ; i++)
    {
        cout<<l<<" "<<x<<endl;
        l=x;
        x++;
    }
    while(n>=x)
    {
        cout<<1<<" "<<x++<<endl;;
    }

}


#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define ll long long
using namespace std;
ll x=2,l=1,n,ans,q,M1,M2,d,h;
int a,b;
map<int,int>m;
vector<pair<int,int> >v;
int main(){
    cin>>n>>d>>h;
    if(n<d+1)   {cout<<-1<<endl;return 0;}
    if(d&1)
    {
        if((d+1)/2>h)   {cout<<-1<<endl;return 0;}
    }
    else
        if((d)/2>h)   {cout<<-1<<endl;return 0;}
    if(n>2&&d==1)    {cout<<-1<<endl;return 0;}
    for(int i=0 ; i<h ; i++)
    {
        cout<<l<<" "<<x<<endl;;
        l=x;
        x++;
    }
    l=1,x=h+2;
    for(int i=0 ; i<d-h ; i++)
    {
        cout<<l<<" "<<x<<endl;
        l=x;
        x++;
    }
    if(d==h)    h=2;
    else    h=1;
    while(n>=x)
    {
        cout<<h<<" "<<x++<<endl;;
    }

}


#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define ll long long
using namespace std;
ll x=2,l=1,n,ans,q,M1,M2,d,h;
int a,b;
map<int,int>m;
vector<pair<int,int> >v;
int main(){
    cin>>n>>d>>h;
    if(h>d) {cout<<-1<<endl;return 0;}
    if(n<d+1)   {cout<<-1<<endl;return 0;}
    if(d&1)
    {
        if((d+1)/2>h)   {cout<<-1<<endl;return 0;}
    }
    else
        if((d)/2>h)   {cout<<-1<<endl;return 0;}
    if(n>2&&d==1||n>2&&h==1)    {cout<<-1<<endl;return 0;}
    for(int i=0 ; i<h ; i++)
    {
        cout<<l<<" "<<x<<endl;;
        l=x;
        x++;
    }
    l=1,x=h+2;
    for(int i=0 ; i<d-h ; i++)
    {
        cout<<l<<" "<<x<<endl;
        l=x;
        x++;
    }
    while(n>=x)
    {
        cout<<2<<" "<<x++<<endl;
    }

}


#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define ll long long
using namespace std;
ll q,cnt,sum,k,c,st=0,neg,pos,end;
vector<int>p,n;
vector<char>v;
int main(){
    ios_base::sync_with_stdio(0),cin.tie(0),cout.tie(0);
    string s;
    getline(cin,s);
    for(int i=0 ; i<s.size() ; i++)
    {
        if(s[i]=='-')
            neg++,v.pb(s[i]);
        else if(s[i]=='+')
            pos++,v.pb(s[i]);
        else if(s[i]=='=')
        {
            for(int j=i+1 ; j<s.size() ; j++)
                if(isdigit(s[j]))
                    c=c*10+(s[j]-'0');
            break;
        }
    }
    pos++;
    ll d=(c+neg)/pos,r=0;
    if(c%pos!=0)
        r=c%pos;
    //cout<<d<<" "<<pos<<" "<<r<<endl;
    if(d==0||d>c)
    {
        cout<<"Impossible"<<endl;
        return 0;
    }
    for(int i=0 ; i<pos ; i++)    p.pb(d);
    for(int i=0 ; i<pos&&r ; i++)
    {
        if(p[i]+r>c)
        {
            r-=(c-p[i]);
            p[i]=c;
        }
        else
        {
            p[i]+=r;
            r=0;
            break;
        }
    }
    if(r)
    {
        cout<<"Impossible"<<endl;
        return 0;
    }
    else
    {
        cout<<"Possible"<<endl;
        cout<<p[0]<< " ";
        ll a=1,b=0;
        for(int i=0 ; i<v.size() ; i++)
            if(v[i]=='-')
                cout<<"- "<<1<<" ";
            else    cout<<"+ "<<p[a++]<<" ";
    }
    cout<<"= "<<c<<endl;

}


#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define ll long long
using namespace std;
ll x=2,l=1,n,ans,q,M1,M2,d,h;
int a,b;
map<int,int>m;
vector<pair<int,int> >v;
int main(){
    cin>>n>>d>>h;
    if(n<d+1)   {cout<<-1<<endl;return 0;}
    if(d&1)
    {
        if((d+1)/2>h)   {cout<<-1<<endl;return 0;}
    }
    else
        if((d)/2>h)   {cout<<-1<<endl;return 0;}
    if(n>2&&d==1||n>2&&h==1)    {cout<<-1<<endl;return 0;}
    for(int i=0 ; i<h ; i++)
    {
        cout<<l<<" "<<x<<endl;;
        l=x;
        x++;
    }
    l=1,x=h+2;
    for(int i=0 ; i<d-h ; i++)
    {
        cout<<l<<" "<<x<<endl;
        l=x;
        x++;
    }
    while(n>=x)
    {
        cout<<1<<" "<<x++<<endl;;
    }

}


#include<bits/stdc++.h>
using namespace std;
#define mp make_pair
#define pb push_back
#define F first
#define S second
#define ll long long
using namespace std;
ll x=2,l=1,n,ans,q,M1,M2,d,h;
int a,b;
map<int,int>m;
vector<pair<int,int> >v;
int main(){
    cin>>n>>d>>h;
    if(n<d+1)   {cout<<-1<<endl;return 0;}
    if(d&1)
    {
        if((d+1)/2>h)   {cout<<-1<<endl;return 0;}
    }
    if(n>2&&d==1||n>2&&h==1)    {cout<<-1<<endl;return 0;}
    else
        if((d)/2>h)   {cout<<-1<<endl;return 0;}
    for(int i=0 ; i<h ; i++)
    {
        cout<<l<<" "<<x<<endl;;
        l=x;
        x++;
    }
    l=1,x=h+2;
    for(int i=0 ; i<d-h ; i++)
    {
        cout<<l<<" "<<x<<endl;
        l=x;
        x++;
    }
    while(n>=x)
    {
        cout<<1<<" "<<x++<<endl;;
    }

}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (n==2){
        if (d==h && d==1) cout<<1<<" "<<2;
        else cout<<-1;
        return 0;
    }
    if (n==3){
        if (d==2 && h==1){
            cout<<"1 2\n1 3";
        }
        else if (d==2 && h==2){
            cout<<"1 2\n2 3";
        }
        return 0;
    }
    if (d>2*h) return (cout<<-1),0;
    int u=1,v=2;
    for(int i=1;i<=h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=d-h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 2;
    for(int i=1;i<=(n-1)-(d);i++)
        cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (h==n-1){
        if (h==d){
            for(int i=1;i<n;i++){
                cout<<i<<" "<<i+1<<"\n";
            }
        }
        else cout<<-1;
        return 0;
    }
    if (d==h||d>2*h) return (cout<<-1),0;
    int u=1,v=2;
    for(int i=1;i<=h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=d-h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=(n-1)-(d);i++)
        cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (n==2){
        if (h==d && d==1) cout<<"1 2";
        else cout<<-1;
        return 0;
    }
    if (d==1||d>2*h) return cout<<-1,0;
    int u = 1,v=2;
    for(int i=1;i<=h;i++) cout<<u++<<" "<<v++<<"\n";
    u = 1;
    for(int i=1;i<=d-h;i++) cout<<u<<" "<<v<<"\n",u = v++;
    if (h==1) u = 1;
    else u = 2;
    for(int i=1;i<=n-1 - d;i++) cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (h==n-1){
        if (h==d){
            for(int i=1;i<n;i++){
                cout<<i<<" "<<i+1<<"\n";
            }
        }
        else cout<<-1;
        return 0;
    }
    if (d>2*h) return (cout<<-1),0;
    int u=1,v=2;
    for(int i=1;i<=h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=d-h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 2;
    for(int i=1;i<=(n-1)-(d);i++)
        cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
set<int,greater<int> > st;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (h==n-1){
        if (h==d){
            for(int i=1;i<n;i++){
                cout<<i<<" "<<i+1<<"\n";
            }
        }
        else cout<<-1;
        return 0;
    }
    if (d<=h||d>2*h) return (cout<<-1),0;
    int u=1,v=2;
    for(int i=1;i<=h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=d-h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=(n-1)-(d);i++)
        cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (n==2){
        if (h==d && d==1) cout<<"1 2";
        else cout<<-1;
        return 0;
    }
    if (d==1||d>2*h) return cout<<-1,0;
    int u = 1,v=2;
    for(int i=1;i<=h;i++) cout<<u++<<" "<<v++<<"\n";
    u = 1;
    for(int i=1;i<=d-h;i++) cout<<u<<" "<<v<<"\n",u = v++;
    if (h==1) u = 1;
    else h = 2;
    for(int i=1;i<=n-1 - d;i++) cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (h==n-1){
        if (h==d){
            for(int i=1;i<n;i++){
                cout<<i<<" "<<i+1<<"\n";
            }
        }
        else cout<<-1;
        return 0;
    }

    if (d>2*h) return (cout<<-1),0;
    int u=1,v=2;
    for(int i=1;i<=h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=d-h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=(n-1)-(d);i++)
        cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (n==2){
        if (d==h && d==1) cout<<1<<" "<<2;
        else cout<<-1;
        return 0;
    }
    if (n==3){
        if (d==2 && h==1){
            cout<<"1 2\n1 3";
        }
        else if (d==2 && h==2){
            cout<<"1 2\n2 3";
        }
        return 0;
    }
    if (h==d){
        if (h!=n-1) return (cout<<-1),0;
        for(int i=1;i<n;i++) cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if (d>2*h) return (cout<<-1),0;
    int u=1,v=2;
    for(int i=1;i<=h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=d-h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    if (h==1) u = 1;
    else u = 2;
    for(int i=1;i<=(n-1)-(d);i++)
        cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (n==2){
        if (d==h && d==1) cout<<1<<" "<<2;
        else cout<<-1;
        return 0;
    }
    if (n==3){
        if (d==2 && h==1){
            cout<<"1 2\n1 3";
        }
        else if (d==2 && h==2){
            cout<<"1 2\n2 3";
        }
        return 0;
    }
    if (h==d){
        if (h!=n-1) return (cout<<-1),0;
        for(int i=1;i<n;i++) cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if (d>2*h) return (cout<<-1),0;
    int u=1,v=2;
    for(int i=1;i<=h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=d-h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    if (!(d-h)) u = 2;
    else u = 1;
    for(int i=1;i<=(n-1)-(d);i++)
        cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (n==2){
        if (d==h && d==1) cout<<1<<" "<<2;
        else cout<<-1;
        return 0;
    }
    if (n==3){
        if (d==2 && h==1){
            cout<<"1 2\n1 3";
        }
        else if (d==2 && h==2){
            cout<<"1 2\n2 3";
        }
        return 0;
    }
    if (h==d){
        if (h!=n-1) return (cout<<-1),0;
        for(int i=1;i<n;i++) cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if (d>2*h) return (cout<<-1),0;
    int u=1,v=2;
    for(int i=1;i<=h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=d-h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=(n-1)-(d);i++)
        cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (h==n-1){
        if (h==d){
            for(int i=1;i<n;i++){
                cout<<i<<" "<<i+1<<"\n";
            }
        }
        else cout<<-1;
        return 0;
    }
    if (n==3 && d==1) return (cout<<-1),0;
    if (d>2*h) return (cout<<-1),0;
    int u=1,v=2;
    for(int i=1;i<=h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 1;
    for(int i=1;i<=d-h;i++){
        cout<<u<<" "<<v<<"\n";
        u = v; v++;
    }
    u = 2;
    for(int i=1;i<=(n-1)-(d);i++)
        cout<<u<<" "<<v++<<"\n";
}


#include <bits/stdc++.h>
using namespace std;
const long long mod = 1e9+7;
const long double eps = 1e-7;
double PI = 3.14159265359;
#define readFile freopen("input","r",stdin)
#define writeFile freopen("output","w",stdout)
#define fastIO ios::sync_with_stdio(0),cin.tie(0),cout.tie(0)
typedef unsigned long long ULL;
typedef pair<long long,long long> ii;
const long long INF = 1e17;
const long long N=200001;
int n,h,d;
set<int,greater<int> > st;
int main(){
#ifndef ONLINE_JUDGE
    readFile;
//    writeFile;
#endif
    fastIO;
    cin>>n>>d>>h;
    if (d==n-1){
        if (h==d){
            for(int i=1;i<n;i++){
                cout<<i<<" "<<i+1<<"\n";
            }
        }
        else cout<<-1;
        return 0;
    }
    if (d<=h||d>2*h) return (cout<<-1),0;
    int u=1,v=2;
    for(int i=1;i<=h;i++){
        cout<<u++<<" "<<v++<<"\n";
    }
    u = 1;
    for(int i=1;i<=d-h;i++){
        cout<<u<<" "<<v++<<"\n";
        u = v-1;
    }
    u = 1;
    for(int i=1;i<=(n-1)-(d);i++)
        cout<<u<<" "<<v++<<"\n";
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
vector<pair<ll,ll> >a;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x,ans=0;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n<(1+d)))
	{
		cout<<"-1";
		return 0;

	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		a.eb(make_pair(i,j));
		if(i>n||j>n)
		{ans=-1;
		break;}
		visit[i]++;
		visit[j]++;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		a.eb(make_pair(x,j));
		if(x>n||j>n)
		{ans=-1;
		break;}

		visit[j]++;
		visit[x]++;
		x=j;
	}

	for(i=1,x=n+1;i<=n;i++)
	{
		if(visit[i]>1)
		{
			x=i;
			//trace2(x,x)
			break;
		}
	}

	//if(x>n)
	//ans=-1;

	//if(h==1 && n>2)
	//ans=-1;

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		{
			a.eb(make_pair(x,i));
			if(x>n)
			ans=-1;
		}

	}

	if(ans==-1)
	cout<<"-1";

	else
	{
		for(i=0;i<siz(a);i++)
		cout<<a[i].X<<" "<<a[i].Y<<endl;
	}
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
vector<pair<ll,ll> >a;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x,ans=0;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n<(1+d)))
	{
		cout<<"-1";
		return 0;

	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		a.eb(make_pair(i,j));
		if(i>n||j>n)
		{ans=-1;
		break;}
		visit[i]=1;
		visit[j]=1;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		a.eb(make_pair(x,j));
		if(x>n||j>n)
		{ans=-1;
		break;}

		visit[j]=1;
		visit[x]=1;
		x=j;
	}

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		a.eb(make_pair(2,i));

	}

	if(ans==-1)
	cout<<"-1";

	else
	{
		for(i=0;i<siz(a);i++)
		cout<<a[i].X<<" "<<a[i].Y<<endl;
	}
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
vector<pair<ll,ll> >a;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x,ans=0;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n<(1+d)))
	{
		cout<<"-1";
		return 0;

	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		a.eb(make_pair(i,j));
		if(i>n||j>n)
		{ans=-1;
		break;}
		visit[i]++;
		visit[j]++;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		a.eb(make_pair(x,j));
		if(x>n||j>n)
		{ans=-1;
		break;}

		visit[j]++;
		visit[x]++;
		x=j;
	}

	for(i=1;i<=n;i++)
	{
		if(visit[i]>1)
		{
			x=i;
			break;
		}
	}

	if(x>n)
	ans=-1;

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		a.eb(make_pair(x,i));

	}

	if(ans==-1)
	cout<<"-1";

	else
	{
		for(i=0;i<siz(a);i++)
		cout<<a[i].X<<" "<<a[i].Y<<endl;
	}
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
vector<pair<ll,ll> >a;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x,ans=0;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n<(1+d)))
	{
		cout<<"-1";
		return 0;

	}

	if(h==d && n>(h+1))
	{
		cout<<"-1";
		return 0;

	}

	if(d<h)
	{
		cout<<"-1";
		return 0;
	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		a.eb(make_pair(i,j));
		if(i>n||j>n)
		{ans=-1;
		break;}
		visit[i]=1;
		visit[j]=1;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		a.eb(make_pair(x,j));
		if(x>n||j>n)
		{ans=-1;
		break;}

		visit[j]=1;
		visit[x]=1;
		x=j;
	}

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		a.eb(make_pair(1,i));

	}

	if(ans==-1)
	cout<<"-1";

	else
	{
		for(i=0;i<siz(a);i++)
		cout<<a[i].X<<" "<<a[i].Y<<endl;
	}
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
//vector<ll>t;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n<(1+d))
	{
		cout<<"-1";
		return 0;

	}

	if(h==d && n>(h+1))
	{
		cout<<"-1";
		return 0;

	}

	if(d<h)
	{
		cout<<"-1";
		return 0;
	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		cout<<i<<" "<<j<<endl;
		visit[i]=1;
		visit[j]=1;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		cout<<x<<" "<<j<<endl;
		x=j;
		visit[j]=1;
		visit[i]=1;
	}

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		cout<<"1"<<" "<<i<<endl;
	}
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
vector<pair<ll,ll> >a;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x,ans=0;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n<(1+d)))
	{
		cout<<"-1";
		return 0;

	}

	if(h==d && n>(h+1))
	{
		cout<<"-1";
		return 0;

	}

	if(d<h)
	{
		cout<<"-1";
		return 0;
	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		a.eb(make_pair(i,j));
		if(i>n||j>n)
		{ans=-1;
		break;}
		visit[i]=1;
		visit[j]=1;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		a.eb(make_pair(x,j));
		if(x>n||j>n)
		{ans=-1;
		break;}
		x=j;
		visit[j]=1;
		visit[x]=1;
	}

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		a.eb(make_pair(1,i));

	}

	if(ans==-1)
	cout<<"-1";

	else
	{
		for(i=0;i<siz(a);i++)
		cout<<a[i].X<<" "<<a[i].Y<<endl;
	}
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
vector<pair<ll,ll> >a;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x,ans=0;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n<(1+d)))
	{
		cout<<"-1";
		return 0;

	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		a.eb(make_pair(i,j));
		if(i>n||j>n)
		{ans=-1;
		break;}
		visit[i]++;
		visit[j]++;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		a.eb(make_pair(x,j));
		if(x>n||j>n)
		{ans=-1;
		break;}

		visit[j]++;
		visit[x]++;
		x=j;
	}

	for(i=1;i<=n;i++)
	{
		if(visit[i]>1)
		{
			x=i;
			break;
		}
	}

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		a.eb(make_pair(x,i));

	}

	if(ans==-1)
	cout<<"-1";

	else
	{
		for(i=0;i<siz(a);i++)
		cout<<a[i].X<<" "<<a[i].Y<<endl;
	}
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
//vector<ll>t;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n-1)<d)
	{
		cout<<"-1";
		return 0;

	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		cout<<i<<" "<<j<<endl;
		visit[i]=1;
		visit[j]=1;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		cout<<x<<" "<<j<<endl;
		x=j;
		visit[j]=1;
		visit[i]=1;
	}

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		cout<<"1"<<" "<<i<<endl;
	}
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
vector<pair<ll,ll> >a;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x,ans=0;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n<(1+d)))
	{
		cout<<"-1";
		return 0;

	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		a.eb(make_pair(i,j));
		if(i>n||j>n)
		{ans=-1;
		break;}
		visit[i]++;
		visit[j]++;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		a.eb(make_pair(x,j));
		if(x>n||j>n)
		{ans=-1;
		break;}

		visit[j]++;
		visit[x]++;
		x=j;
	}

	for(i=1;i<=n;i++)
	{
		if(visit[i]>1)
		{
			x=i;
			break;
		}
	}

	if(x>n)
	ans=-1;

	if(h==1 && n>1)
	ans=-1;

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		a.eb(make_pair(x,i));

	}

	if(ans==-1)
	cout<<"-1";

	else
	{
		for(i=0;i<siz(a);i++)
		cout<<a[i].X<<" "<<a[i].Y<<endl;
	}
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
vector<pair<ll,ll> >a;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x,ans=0;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n<(1+d)))
	{
		cout<<"-1";
		return 0;

	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		a.eb(make_pair(i,j));
		if(i>n||j>n)
		{ans=-1;
		break;}
		visit[i]++;
		visit[j]++;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		a.eb(make_pair(x,j));
		if(x>n||j>n)
		{ans=-1;
		break;}

		visit[j]++;
		visit[x]++;
		x=j;
	}

	for(i=1;i<=n;i++)
	{
		if(visit[i]>1)
		{
			x=i;
			break;
		}
	}

	if(x>n)
	ans=-1;

	if(h==1 && n>2)
	ans=-1;

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		a.eb(make_pair(x,i));

	}

	if(ans==-1)
	cout<<"-1";

	else
	{
		for(i=0;i<siz(a);i++)
		cout<<a[i].X<<" "<<a[i].Y<<endl;
	}
}


#include<bits/stdc++.h>

#define X first
#define Y second
#define eb push_back
#define pb pop_back
#define siz(a) int(a.size())
//for traversing the container (bcoz we cannot access linked list etc with direct index)
//c stands for container and it for iterator
#define tr(c, it) \
		for(typeof(c.begin()) it=c.begin() ; it != c.end() ; it++)

#define all(c) c.begin(), c.end()
#define present(container, element) (container.find(element) != container.end()) //whether the element is present in the container

#define trace2(x, y)             cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<< endl;
#define trace3(x, y, z)          cout <<#x<<": "<<x<<" | "<<#y<<": "<<y<<" | "<<#z<<": "<<z<<endl;
#define trace4(a, b, c, d)       cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<endl;
#define trace5(a, b, c, d, e)    cout <<#a<<": "<<a<<" | "<<#b<<": "<<b<<" | "<<#c<<": "<<c<<" | "<<#d<<": "<<d<<" | "<<#e<<": "<<e<<endl;
#define scan(x) scanf("%lld", &x)
#define print(x) printf("%lld", x)
#define pN printf("\n");
using namespace std;

typedef long long int ll;
typedef vector < int > vi;
typedef vector < vi > vvi;
typedef vector < ll > vll;
typedef vector < vll > vvll;

typedef pair < int , int > ii;

const int mod=1e9+7;
const ll maxn = 1e17;
//vector<ll>t;

ll visit[200001],t[200001];
//map<string,string>mp;
//long double d[100001],a1[100001],b1[100001];
//vector<pair<ll,ll> >a ;

/*double sqrt(double y, double precision)
{
    double x = y;  // or find a better initial estimate
    for (;;) {
        double z = y/x;
        if (std::abs(x-z) < 2*precision)
            return x;
        x = (x+z)/2;
    }
}*/

int main(){

	ll n,h,d,i,j,x;

		memset(visit,0,sizeof(visit));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL); cout.tie(NULL);

	cin>>n>>d>>h;

	if((2*h)<d)
	{
		cout<<"-1";
		return 0;

	}

	if((n<(1+d)))
	{
		cout<<"-1";
		return 0;

	}

	if(h==d && n>(h+1))
	{
		cout<<"-1";
		return 0;

	}

	if(d<h)
	{
		cout<<"-1";
		return 0;
	}

	for(i=1,j=2;i<=h;i++,j++)
	{
		cout<<i<<" "<<j<<endl;
		visit[i]=1;
		visit[j]=1;
	}

	for(i=1,x=1;i<=(d-h);i++,j++)
	{
		//trace2(i,j);
		cout<<x<<" "<<j<<endl;
		x=j;
		visit[j]=1;
		visit[i]=1;
	}

	for(i=1;i<=n;i++)
	{
		if(!visit[i])
		cout<<"1"<<" "<<i<<endl;
	}
}


#include <stack>
#include <stdio.h>
#include <list>
#include <cassert>
#include <set>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <functional>
#include <cstring>
#include <algorithm>
#include <cctype>
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <string>
#include <map>
#include <cmath>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define SZ(x) (int)x.size()
#define Lowbit(x) ((x) & (-x))
#define MP(a, b) make_pair(a, b)
#define MS(p, num) memset(p, num, sizeof(p))
#define PB push_back
#define X first
#define Y second
#define ROP freopen("input.txt", "r", stdin);
#define MID(a, b) (a + ((b - a) >> 1))
#define LC rt << 1, l, mid
#define RC rt << 1|1, mid + 1, r
#define LRT rt << 1
#define RRT rt << 1|1
#define FOR(i, a, b) for (int i=(a); (i) < (b); (i)++)
#define FOOR(i, a, b) for (int i = (a); (i)<=(b); (i)++)
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int MAXN = 5e5 + 10;
const int MOD = 1e9 + 7;
const int dir[][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
const int seed = 131;
int cases = 0;
typedef std::pair<int, int> pii;

int main() {
    int n, d, h;
    std::cin >> n >> d >> h;
    if (d < h || d > 2*h) {
        puts("-1");
        return 0;
    }

    if (h == 1 && (d != 1 || n != 2)) { puts("-1"); return 0; }
    int pre = 1, cnt = 1;
    for (int i = 0; i < h; ++i) {
        printf("%d %d\n", pre, ++cnt);
        pre = cnt;
    }

    pre = 1;
    for (int i = 0; i < d - h; ++i) {
        printf("%d %d\n", pre, ++cnt);
        pre = cnt;
    }

    for (int i = 0; i < n - d - 1; ++i) printf("%d %d\n", h == d ? 2 : 1, ++cnt);
    return 0;
}


#include <stack>
#include <stdio.h>
#include <list>
#include <cassert>
#include <set>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <functional>
#include <cstring>
#include <algorithm>
#include <cctype>
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <string>
#include <map>
#include <cmath>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define SZ(x) (int)x.size()
#define Lowbit(x) ((x) & (-x))
#define MP(a, b) make_pair(a, b)
#define MS(p, num) memset(p, num, sizeof(p))
#define PB push_back
#define X first
#define Y second
#define ROP freopen("input.txt", "r", stdin);
#define MID(a, b) (a + ((b - a) >> 1))
#define LC rt << 1, l, mid
#define RC rt << 1|1, mid + 1, r
#define LRT rt << 1
#define RRT rt << 1|1
#define FOR(i, a, b) for (int i=(a); (i) < (b); (i)++)
#define FOOR(i, a, b) for (int i = (a); (i)<=(b); (i)++)
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int MAXN = 5e5 + 10;
const int MOD = 1e9 + 7;
const int dir[][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
const int seed = 131;
int cases = 0;
typedef std::pair<int, int> pii;

int main() {
    int n, d, h;
    std::cin >> n >> d >> h;
    if (d < h || d > 2*h) {
        puts("-1");
        return 0;
    }

    int pre = 1, cnt = 1;
    for (int i = 0; i < h; ++i) {
        printf("%d %d\n", pre, ++cnt);
        pre = cnt;
    }

    pre = 1;
    for (int i = 0; i < d - h; ++i) {
        printf("%d %d\n", pre, ++cnt);
        pre = cnt;
    }

    for (int i = 0; i < n - d - 1; ++i) printf("%d %d\n", h == d ? 2 : 1, ++cnt);
    return 0;
}


#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define LL long long
#define Lowbit(x) ((x)&(-x))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1|1
#define MP(a, b) make_pair(a, b)
const int INF = 0x3f3f3f3f;
const int Mod = 1000000007;
const int maxn = 1e5 + 10;
const double eps = 1e-8;
const double PI = acos(-1.0);
typedef pair<int, int> pii;

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n, d, h;
    scanf("%d%d%d", &n, &d, &h);
    if (h * 2 < d) return puts("-1");
    if (d == 1 && n != 2) return puts("-1");
    if (d == h && n != 2)
    {
        for (int i = 2; i <= d + 1; i++)
            printf("%d %d\n", i-1, i);
        int rt = (d + 1) / 2;

        for (int i = d + 2; i <= n; i++)
            printf("%d %d\n", rt, i);
    }
    else
    {
        for (int i = 2; i <= h + 1; i++)
            printf("%d %d\n", i-1, i);
        if (h + 1 != n)
        {
            printf("%d %d\n", 1, h + 2);
            for (int i = h + 3; i <= d + 1; i++)
                printf("%d %d\n", i-1, i);
            for (int i = d + 2; i <= n; i++)
                printf("%d %d\n", 1, i);
    }
    }
    return 0;
}


#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
#include <time.h>
using namespace std;
#define LL long long
#define Lowbit(x) ((x)&(-x))
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1|1
#define MP(a, b) make_pair(a, b)
const int INF = 0x3f3f3f3f;
const int Mod = 1000000007;
const int maxn = 1e5 + 10;
const double eps = 1e-8;
const double PI = acos(-1.0);
typedef pair<int, int> pii;

int main()
{
    //freopen("in.txt","r",stdin);
    //freopen("out.txt","w",stdout);
    int n, d, h;
    scanf("%d%d%d", &n, &d, &h);
    if (h * 2 < d) return puts("-1");
    if (d == 1 && n != 2) return puts("-1");
    if (d == h && n != 2)
    {
        for (int i = 2; i <= d + 1; i++)
            printf("%d %d\n", i-1, i);
        int rt = (d + 1) / 2;
        if (d + 1 < n) printf("%d %d\n", rt, d + 2);
        for (int i = d + 3; i <= n; i++)
            printf("%d %d\n", i-1, i);
    }
    else
    {
        for (int i = 2; i <= h + 1; i++)
            printf("%d %d\n", i-1, i);
        if (h + 1 != n)
        {
            printf("%d %d\n", 1, h + 2);
            for (int i = h + 3; i <= d + 1; i++)
                printf("%d %d\n", i-1, i);
            for (int i = d + 2; i <= n; i++)
                printf("%d %d\n", 1, i);
    }
    }
    return 0;
}


#include <stack>
#include <stdio.h>
#include <list>
#include <cassert>
#include <set>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <functional>
#include <cstring>
#include <algorithm>
#include <cctype>
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <string>
#include <map>
#include <cmath>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define SZ(x) (int)x.size()
#define Lowbit(x) ((x) & (-x))
#define MP(a, b) make_pair(a, b)
#define MS(p, num) memset(p, num, sizeof(p))
#define PB push_back
#define X first
#define Y second
#define ROP freopen("input.txt", "r", stdin);
#define MID(a, b) (a + ((b - a) >> 1))
#define LC rt << 1, l, mid
#define RC rt << 1|1, mid + 1, r
#define LRT rt << 1
#define RRT rt << 1|1
#define FOR(i, a, b) for (int i=(a); (i) < (b); (i)++)
#define FOOR(i, a, b) for (int i = (a); (i)<=(b); (i)++)
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int MAXN = 5e5 + 10;
const int MOD = 1e9 + 7;
const int dir[][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
const int seed = 131;
int cases = 0;
typedef std::pair<int, int> pii;

int main() {
    int n, d, h;
    std::cin >> n >> d >> h;
    if (d < h || d > 2*h) {
        puts("-1");
        return 0;
    }

    int pre = 1, cnt = 1;
    for (int i = 0; i < h; ++i) {
        printf("%d %d\n", pre, ++cnt);
        pre = cnt;
    }

    pre = 1;
    for (int i = 0; i < d - h; ++i) {
        printf("%d %d\n", pre, ++cnt);
        pre = cnt;
    }

    for (int i = 0; i < n - d; ++i) printf("1 %d\n", ++cnt);
    return 0;
}


#include <stack>
#include <stdio.h>
#include <list>
#include <cassert>
#include <set>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <functional>
#include <cstring>
#include <algorithm>
#include <cctype>
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <string>
#include <map>
#include <cmath>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define SZ(x) (int)x.size()
#define Lowbit(x) ((x) & (-x))
#define MP(a, b) make_pair(a, b)
#define MS(p, num) memset(p, num, sizeof(p))
#define PB push_back
#define X first
#define Y second
#define ROP freopen("input.txt", "r", stdin);
#define MID(a, b) (a + ((b - a) >> 1))
#define LC rt << 1, l, mid
#define RC rt << 1|1, mid + 1, r
#define LRT rt << 1
#define RRT rt << 1|1
#define FOR(i, a, b) for (int i=(a); (i) < (b); (i)++)
#define FOOR(i, a, b) for (int i = (a); (i)<=(b); (i)++)
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int MAXN = 5e5 + 10;
const int MOD = 1e9 + 7;
const int dir[][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
const int seed = 131;
int cases = 0;
typedef std::pair<int, int> pii;

int main() {
    int n, d, h;
    std::cin >> n >> d >> h;
    if (d < h || d > 2*h) {
        puts("-1");
        return 0;
    }

    if (h == 1) {
        if (d == 1) {
            if (n > 2) {
                puts("-1");
                return 0;
            }
        }
    }
    int pre = 1, cnt = 1;
    for (int i = 0; i < h; ++i) {
        printf("%d %d\n", pre, ++cnt);
        pre = cnt;
    }

    pre = 1;
    for (int i = 0; i < d - h; ++i) {
        printf("%d %d\n", pre, ++cnt);
        pre = cnt;
    }

    for (int i = 0; i < n - d - 1; ++i) printf("%d %d\n", h == d ? 2 : 1, ++cnt);
    return 0;
}


#include <stack>
#include <stdio.h>
#include <list>
#include <cassert>
#include <set>
#include <iostream>
#include <string>
#include <sstream>
#include <vector>
#include <unordered_map>
#include <queue>
#include <functional>
#include <cstring>
#include <algorithm>
#include <cctype>
//#pragma comment(linker, "/STACK:102400000,102400000")
#include <string>
#include <map>
#include <cmath>
using namespace std;
#define LL long long
#define ULL unsigned long long
#define SZ(x) (int)x.size()
#define Lowbit(x) ((x) & (-x))
#define MP(a, b) make_pair(a, b)
#define MS(p, num) memset(p, num, sizeof(p))
#define PB push_back
#define X first
#define Y second
#define ROP freopen("input.txt", "r", stdin);
#define MID(a, b) (a + ((b - a) >> 1))
#define LC rt << 1, l, mid
#define RC rt << 1|1, mid + 1, r
#define LRT rt << 1
#define RRT rt << 1|1
#define FOR(i, a, b) for (int i=(a); (i) < (b); (i)++)
#define FOOR(i, a, b) for (int i = (a); (i)<=(b); (i)++)
const double PI = acos(-1.0);
const int INF = 0x3f3f3f3f;
const double eps = 1e-8;
const int MAXN = 5e5 + 10;
const int MOD = 1e9 + 7;
const int dir[][2] = {{-1, 0}, {1, 0}, {0, -1}, {0, 1}, {-1, -1}, {-1, 1}, {1, -1}, {1, 1}};
const int seed = 131;
int cases = 0;
typedef std::pair<int, int> pii;

int main() {
    int n, d, h;
    std::cin >> n >> d >> h;
    if (d < h || d > 2*h) {
        puts("-1");
        return 0;
    }

    int pre = 1, cnt = 1;
    for (int i = 0; i < h; ++i) {
        printf("%d %d\n", pre, ++cnt);
        pre = cnt;
    }

    pre = 1;
    for (int i = 0; i < d - h; ++i) {
        printf("%d %d\n", pre, ++cnt);
        pre = cnt;
    }

    for (int i = 0; i < n - d - 1; ++i) printf("1 %d\n", ++cnt);
    return 0;
}


#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
using namespace std;
const int NMAX = 150005;

int N,H,D;

int main()
{

    cin>>N>>D>>H;
    if(D == H && D == N-1){
        for(int i = 1 ; i <= N - 1 ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if(D < H){
        cout<<-1;
        return 0;
    }
    if(2 * H < D){
        cout<<-1<<"\n";
        return 0;
    }
    if(D == H){
        for(int i = 1 ; i <= D ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        for(int i = D + 1 ; i < N ; ++i)
            cout<<2<<" "<<i+1<<"\n";
        return 0;
    }
    int i;
    for(i = 1 ; i <= H ; ++i)
        cout<<i<<" "<<i+1<<"\n";
    i += 1;
    cout<<1<<" "<<i<<"\n";
    for(int j = 1 ; j <= D - H - 1; ++j){
        cout<<i<<" "<<i+1<<"\n";
        ++i;
    }
    ++i;
    for(int j = i ; j <= N ; ++j)
        cout<<1<<" "<<j<<"\n";
    return 0;
}


#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
using namespace std;
const int NMAX = 150005;

int N,H,D;

int main()
{

    cin>>N>>D>>H;
    if(D == H && D == N-1){
        for(int i = 1 ; i <= N - 1 ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if(D <= H){
        cout<<-1;
        return 0;
    }
    if(2 * H < D){
        cout<<-1<<"\n";
        return 0;
    }
    int i;
    for(i = 1 ; i <= H ; ++i)
        cout<<i<<" "<<i+1<<"\n";
    i += 1;
    cout<<1<<" "<<i<<"\n";
    for(int j = 1 ; j <= D - H - 1; ++j){
        cout<<i<<" "<<i+1<<"\n";
        ++i;
    }
    ++i;
    for(int j = i ; j <= N ; ++j)
        cout<<1<<" "<<j<<"\n";
    return 0;
}


#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
using namespace std;
const int NMAX = 150005;

int N,H,D;

int main()
{

    cin>>N>>D>>H;
    if(D == H && D == N-1){
        for(int i = 1 ; i <= N - 1 ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if(D < H){
        cout<<-1;
        return 0;
    }
    if(2 * H < D){
        cout<<-1<<"\n";
        return 0;
    }
    if(D == H){
        for(int i = 1 ; i <= D ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        for(int i = D + 2 ; i <= N ; ++i)
            cout<<D+2<<" "<<i+1<<"\n";
        return 0;
    }
    int i;
    for(i = 1 ; i <= H ; ++i)
        cout<<i<<" "<<i+1<<"\n";
    i += 1;
    cout<<1<<" "<<i<<"\n";
    for(int j = 1 ; j <= D - H - 1; ++j){
        cout<<i<<" "<<i+1<<"\n";
        ++i;
    }
    ++i;
    for(int j = i ; j <= N ; ++j)
        cout<<1<<" "<<j<<"\n";
    return 0;
}


#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
using namespace std;
const int NMAX = 150005;

int N,H,D;

int main()
{

    cin>>N>>D>>H;
    if(D == H && D == N-1){
        for(int i = 1 ; i <= N - 1 ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if(D < H){
        cout<<-1;
        return 0;
    }
    if(2 * H < D){
        cout<<-1<<"\n";
        return 0;
    }
    int i;
    for(i = 1 ; i <= H ; ++i)
        cout<<i<<" "<<i+1<<"\n";
    ++i;
    cout<<1<<" "<<i<<"\n";
    for(int j = 1 ; j <= D - H - 1; ++j)
        cout<<i<<" "<<i+1<<"\n";
    i+= 2;
    for(int j = i ; j <= N ; ++j)
        cout<<1<<" "<<j<<"\n";
    return 0;
}


#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
using namespace std;
const int NMAX = 150005;

int N,H,D;

int main()
{

    cin>>N>>D>>H;
    if(D == H && D == N-1){
        for(int i = 1 ; i <= N - 1 ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if(D < H){
        cout<<-1;
        return 0;
    }
    if(2 * H < D){
        cout<<-1;
        return 0;
    }
    int i;
    for(i = 1 ; i <= H ; ++i)
        cout<<i<<" "<<i+1<<"\n";
    ++i;
    cout<<1<<" "<<i<<"\n";
    for(int j = 1 ; j <= D - H - 1; ++j)
        cout<<i<<" "<<i+1<<"\n";
    ++i;
    for(int j = i ; j <= N ; ++j)
        cout<<1<<" "<<j<<"\n";
    return 0;
}


#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
using namespace std;
const int NMAX = 150005;

int N,H,D;

int main()
{

    cin>>N>>D>>H;
    if(D == H && D == N-1){
        for(int i = 1 ; i <= N - 1 ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if(D < H){
        cout<<-1;
        return 0;
    }
    if(2 * H < D){
        cout<<-1<<"\n";
        return 0;
    }
    if(D == H && D > 1){
        for(int i = 1 ; i <= D ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        for(int i = D + 1 ; i < N ; ++i)
            cout<<2<<" "<<i+1<<"\n";
        return 0;
    }
    if(D == H){
        cout<<-1;
        return 0;
    }
    int i;
    for(i = 1 ; i <= H ; ++i)
        cout<<i<<" "<<i+1<<"\n";
    i += 1;
    cout<<1<<" "<<i<<"\n";
    for(int j = 1 ; j <= D - H - 1; ++j){
        cout<<i<<" "<<i+1<<"\n";
        ++i;
    }
    ++i;
    for(int j = i ; j <= N ; ++j)
        cout<<1<<" "<<j<<"\n";
    return 0;
}


#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
using namespace std;
const int NMAX = 150005;

int N,H,D;

int main()
{

    cin>>N>>D>>H;
    if(D == H && D == N-1){
        for(int i = 1 ; i <= N - 1 ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if(D < H){
        cout<<-1;
        return 0;
    }
    if(2 * H < D){
        cout<<-1<<"\n";
        return 0;
    }
    if(D == H){
        for(int i = 1 ; i <= D ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        for(int i = D + 2 ; i < N ; ++i)
            cout<<D+2<<" "<<i+1<<"\n";
        return 0;
    }
    int i;
    for(i = 1 ; i <= H ; ++i)
        cout<<i<<" "<<i+1<<"\n";
    i += 1;
    cout<<1<<" "<<i<<"\n";
    for(int j = 1 ; j <= D - H - 1; ++j){
        cout<<i<<" "<<i+1<<"\n";
        ++i;
    }
    ++i;
    for(int j = i ; j <= N ; ++j)
        cout<<1<<" "<<j<<"\n";
    return 0;
}


#include<iostream>
#include<vector>
#include<set>
#include<algorithm>
#include<queue>
#include<stack>
#include<deque>
using namespace std;
const int NMAX = 150005;

int N,H,D;

int main()
{

    cin>>N>>D>>H;
    if(D == H && D == N-1){
        for(int i = 1 ; i <= N - 1 ; ++i)
            cout<<i<<" "<<i+1<<"\n";
        return 0;
    }
    if(D < H){
        cout<<-1;
        return 0;
    }
    if(2 * H < D){
        cout<<-1<<"\n";
        return 0;
    }
    int i;
    for(i = 1 ; i <= H ; ++i)
        cout<<i<<" "<<i+1<<"\n";
    i += 1;
    cout<<1<<" "<<i<<"\n";
    for(int j = 1 ; j <= D - H - 1; ++j){
        cout<<i<<" "<<i+1<<"\n";
        ++i;
    }
    ++i;
    for(int j = i ; j <= N ; ++j)
        cout<<1<<" "<<j<<"\n";
    return 0;
}


#include<bits/stdc++.h>
#define ll long long int
void pre(){
freopen("ip.txt","r",stdin);
//freopen("op.txt","w",stdin);
}
using namespace std;
pair<int,int>p[2*100002];
int ptr;
int n,d,h;
int main(){
//pre();
cin>>n>>d>>h;

    int cnt=1;
    int prev=cnt;
    for(int i=2;i<=h+1;i++){
            p[ptr++]=make_pair(prev,++cnt);
            prev=cnt;
        }
        prev=1;
    for(int i = 1;i<=d-h;i++){
        p[ptr++]=make_pair(prev,++cnt);
        prev=cnt;
    }
    if(cnt>n){
        puts("-1");
        return 0;
    }
    int d=cnt;
    for(int i=1;i<=n-d;i++)
        p[ptr++]=make_pair(1,++cnt);
    for(int i = 0;i<ptr;i++)printf("%d %d\n",p[i].first,p[i].second);
return 0;
}


#include<bits/stdc++.h>
#define ll long long int
void pre(){
freopen("ip.txt","r",stdin);
//freopen("op.txt","w",stdin);
}
using namespace std;
pair<int,int>p[2*100002];
int ptr;
int n,d,h;
int main(){
//pre();
cin>>n>>d>>h;
ll x = d , y=h;
if(x>2LL*y){
cout<<"-1\n";
return 0;
}
    int cnt=1;
    int prev=cnt;
    for(int i=2;i<=h+1;i++){
            p[ptr++]=make_pair(prev,++cnt);
            prev=cnt;
        }
        prev=1;
    for(int i = 1;i<=d-h;i++){
        p[ptr++]=make_pair(prev,++cnt);
        prev=cnt;
    }
    if(cnt>n){
        puts("-1");
        return 0;
    }
    d=cnt;
    for(int i=1;i<=n-d;i++)
        p[ptr++]=make_pair(1,++cnt);
    for(int i = 0;i<ptr;i++)printf("%d %d\n",p[i].first,p[i].second);
return 0;
}


#include<bits/stdc++.h>
#define ll long long int
void pre(){
freopen("ip.txt","r",stdin);
//freopen("op.txt","w",stdin);
}
using namespace std;
pair<int,int>p[2*100002];
int ptr;
int n,d,h;
int main(){
//pre();
cin>>n>>d>>h;
ll x = d , y=h;
if(x>2LL*y){
cout<<"-1\n";
return 0;
}
int d1=0;
    int cnt=1;
    int prev=cnt;
    for(int i=2;i<=h+1;i++){
            p[ptr++]=make_pair(prev,++cnt);
            prev=cnt;
        }
        prev=1;
    for(int i = 1;i<=d-h;i++){
        d1++;
        p[ptr++]=make_pair(prev,++cnt);
        prev=cnt;
    }
    if(cnt>n){
        puts("-1");
        return 0;
    }

    int pos=1;
    if(d==h) pos=2;
    d=cnt;
    for(int i=1;i<=n-d;i++)
        p[ptr++]=make_pair(pos,++cnt);
    for(int i = 0;i<ptr;i++)printf("%d %d\n",p[i].first,p[i].second);
return 0;
}


#include<bits/stdc++.h>
#define ll long long int
void pre(){
freopen("ip.txt","r",stdin);
//freopen("op.txt","w",stdin);
}
using namespace std;
pair<int,int>p[2*100002];
int ptr;
int n,d,h;
int main(){
//pre();
cin>>n>>d>>h;
if(d>2*h || d<h){
    puts("-1");
    return 0;
}
else{
    int cnt=1;
    int prev=cnt;
    for(int i=2;i<=h+1;i++){
            p[ptr++]=make_pair(prev,++cnt);
            prev=cnt;
        }
        prev=1;
    for(int i = 1;i<=d-h;i++){
        p[ptr++]=make_pair(prev,++cnt);
        prev=cnt;
    }
    if(cnt>n){
        puts("-1");
        return 0;
    }
    for(int i=1;i<=n-cnt;i++)
        p[ptr++]=make_pair(1,++cnt);
    for(int i = 0;i<ptr;i++)printf("%d %d\n",p[i].first,p[i].second);
}
return 0;
}


#include<bits/stdc++.h>
#define ll long long int
void pre(){
freopen("ip.txt","r",stdin);
//freopen("op.txt","w",stdin);
}
using namespace std;
pair<int,int>p[2*100002];
int ptr;
int n,d,h;
int main(){
//pre();
cin>>n>>d>>h;
ll x = d , y=h;
if(x>2LL*y){
cout<<"-1\n";
return 0;
}
if(h==d && n>2 && h==1){
cout<<"-1\n";
return 0;
}
int d1=0;
    int cnt=1;
    int prev=cnt;
    for(int i=2;i<=h+1;i++){
            p[ptr++]=make_pair(prev,++cnt);
            prev=cnt;
        }
        prev=1;
    for(int i = 1;i<=d-h;i++){
        d1++;
        p[ptr++]=make_pair(prev,++cnt);
        prev=cnt;
    }
    if(cnt>n){
        puts("-1");
        return 0;
    }

    int pos=1;
    if(d==h) pos=2;
    d=cnt;
    for(int i=1;i<=n-d;i++)
        p[ptr++]=make_pair(pos,++cnt);
    for(int i = 0;i<ptr;i++)printf("%d %d\n",p[i].first,p[i].second);
return 0;
}


#include<bits/stdc++.h>
#define ll long long int
void pre(){
freopen("ip.txt","r",stdin);
//freopen("op.txt","w",stdin);
}
using namespace std;
pair<int,int>p[2*100002];
int ptr;
int n,d,h;
int main(){
// pre();
cin>>n>>d>>h;

    int cnt=1;
    int prev=cnt;
    for(int i=2;i<=h+1;i++){
            p[ptr++]=make_pair(prev,++cnt);
            prev=cnt;
        }
        prev=1;
    for(int i = 1;i<=d-h;i++){
        p[ptr++]=make_pair(prev,++cnt);
        prev=cnt;
    }
    if(cnt>n){
        puts("-1");
        return 0;
    }
    for(int i=1;i<=n-cnt;i++)
        p[ptr++]=make_pair(1,++cnt);
    for(int i = 0;i<ptr;i++)printf("%d %d\n",p[i].first,p[i].second);
return 0;
}


#include<bits/stdc++.h>
#define ll long long int
void pre(){
freopen("ip.txt","r",stdin);
//freopen("op.txt","w",stdin);
}
using namespace std;
pair<int,int>p[2*100002];
int ptr;
int n,d,h;
int main(){
//pre();
cin>>n>>d>>h;
if(d>2*h){
puts("-1");
return 0;
}
    int cnt=1;
    int prev=cnt;
    for(int i=2;i<=d+1;i++){
            p[ptr++]=make_pair(prev,++cnt);
            prev=cnt;
        }
        prev=1;
    for(int i = 1;i<=d-h;i++){
        p[ptr++]=make_pair(prev,++cnt);
        prev=cnt;
    }
    if(cnt>n){
        puts("-1");
        return 0;
    }
    d=cnt;
    for(int i=1;i<=n-d;i++)
        p[ptr++]=make_pair(1,++cnt);
    for(int i = 0;i<ptr;i++)printf("%d %d\n",p[i].first,p[i].second);
return 0;
}


#include<bits/stdc++.h>
#define ll long long int
void pre(){
freopen("ip.txt","r",stdin);
//freopen("op.txt","w",stdin);
}
using namespace std;
pair<int,int>p[2*100002];
int ptr;
int n,d,h;
int main(){
//pre();
cin>>n>>d>>h;
int d1=0;
    int cnt=1;
    int prev=cnt;
    for(int i=2;i<=h+1;i++){
            p[ptr++]=make_pair(prev,++cnt);
            prev=cnt;
        }
        prev=1;
    for(int i = 1;i<=d-h;i++){
        d1++;
        p[ptr++]=make_pair(prev,++cnt);
        prev=cnt;
    }
    if(cnt>n || d1>h){
        puts("-1");
        return 0;
    }
    d=cnt;
    for(int i=1;i<=n-d;i++)
        p[ptr++]=make_pair(1,++cnt);
    for(int i = 0;i<ptr;i++)printf("%d %d\n",p[i].first,p[i].second);
return 0;
}


#include<bits/stdc++.h>
#define ll long long int
void pre(){
freopen("ip.txt","r",stdin);
//freopen("op.txt","w",stdin);
}
using namespace std;
pair<int,int>p[2*100002];
int ptr;
int n,d,h;
int main(){
// pre();
cin>>n>>d>>h;
if(d>2*h){
puts("-1");
return 0;
}
    int cnt=1;
    int prev=cnt;
    for(int i=2;i<=h+1;i++){
            p[ptr++]=make_pair(prev,++cnt);
            prev=cnt;
        }
        prev=1;
    for(int i = 1;i<=d-h;i++){
        p[ptr++]=make_pair(prev,++cnt);
        prev=cnt;
    }
    if(cnt>n){
        puts("-1");
        return 0;
    }
    int d=cnt;
    for(int i=1;i<=n-d;i++)
        p[ptr++]=make_pair(1,++cnt);
    for(int i = 0;i<ptr;i++)printf("%d %d\n",p[i].first,p[i].second);
return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>
#include <algorithm>
#include <utility>
#include <string>
#include <stdio.h>
#include <map>
using namespace std;
#define slope(x11, y11, x22, y22) ((double)y11-(double)y22)/((double)x11-(double)x22)

bool used[1000000];

int main() {
	int n, d, h;
	cin >> n >> d >> h;
	if (h * 2 < d)
		cout << -1 << endl;
	else if (d / 2 + d % 2 > h)
		cout << -1 << endl;
	else if (h == d && h != n - 1)
		cout << -1 << endl;
	else if (h > d)
		cout << -1 << endl;
	else {
		int idx = 2, q = 1, w = 2, a = h, b = d - h;
		for (int i = 0; i < a; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = q + 1;
			w = w + 1;
		}
		q = 1;
		for (int i = 0; i < b; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = w, w = w + 1;
		}
		for (int i = 1; i <= n; i++) if (!used[i])
			cout << 1 << " " << i << endl;
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>
#include <algorithm>
#include <utility>
#include <string>
#include <stdio.h>
#include <map>
using namespace std;
#define slope(x11, y11, x22, y22) ((double)y11-(double)y22)/((double)x11-(double)x22)

bool used[1000000];

int main() {
	int n, d, h;
	cin >> n >> d >> h;
	if (h * 2 < d)
		cout << -1 << endl;
	else if (d / 2 + d % 2 > h)
		cout << -1 << endl;
	else if (h == d)
		cout << -1 << endl;
	else {
		int idx = 2, q = 1, w = 2, a = h, b = d - h;
		for (int i = 0; i < a; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = q + 1;
			w = w + 1;
		}
		q = 1;
		for (int i = 0; i < b; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = w, w = w + 1;
		}
		for (int i = 1; i <= n; i++) if (!used[i])
			cout << 1 << " " << i << endl;
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>
#include <algorithm>
#include <utility>
#include <string>
#include <stdio.h>
#include <map>
using namespace std;
#define slope(x11, y11, x22, y22) ((double)y11-(double)y22)/((double)x11-(double)x22)

bool used[1000000];

int main() {
	int n, d, h;
	cin >> n >> d >> h;
	if (h * 2 < d)
		cout << -1 << endl;
	else if (d / 2 + d % 2 > h)
		cout << -1 << endl;
	else if (h > d / 2+d%2)
		cout << -1 << endl;
	else {
		int idx = 2, q = 1, w = 2, a = d / 2, b = d / 2 + d % 2;
		for (int i = 0; i < a; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = q + 1;
			w = w + 1;
		}
		q = 1;
		for (int i = 0; i < b; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = w, w = w + 1;
		}
		for (int i = 1; i <= n; i++) if (!used[i])
			cout << 1 << " " << i << endl;
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>
#include <algorithm>
#include <utility>
#include <string>
#include <stdio.h>
#include <map>
using namespace std;
#define slope(x11, y11, x22, y22) ((double)y11-(double)y22)/((double)x11-(double)x22)

bool used[1000000];

int main() {
	int n, d, h;
	cin >> n >> d >> h;
	if (h * 2 < d)
		cout << -1 << endl;
	else if (d / 2 + d % 2 > h)
		cout << -1 << endl;
	else if (h > d / 2)
		cout << -1 << endl;
	else {
		int idx = 2, q = 1, w = 2, a = d / 2, b = d / 2 + d % 2;
		for (int i = 0; i < a; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = q + 1;
			w = w + 1;
		}
		q = 1;
		for (int i = 0; i < b; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = w, w = w + 1;
		}
		for (int i = 1; i <= n; i++) if (!used[i])
			cout << 1 << " " << i << endl;
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>
#include <algorithm>
#include <utility>
#include <string>
#include <stdio.h>
#include <map>
using namespace std;
#define slope(x11, y11, x22, y22) ((double)y11-(double)y22)/((double)x11-(double)x22)

bool used[1000000];

int main() {
	int n, d, h;
	cin >> n >> d >> h;
	if (h * 2 < d)
		cout << -1 << endl;
	else if (d / 2 + d % 2 > h)
		cout << -1 << endl;
	else if (h == d && h!=n-1)
		cout << -1 << endl;
	else {
		int idx = 2, q = 1, w = 2, a = h, b = d - h;
		for (int i = 0; i < a; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = q + 1;
			w = w + 1;
		}
		q = 1;
		for (int i = 0; i < b; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = w, w = w + 1;
		}
		for (int i = 1; i <= n; i++) if (!used[i])
			cout << 1 << " " << i << endl;
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>
#include <algorithm>
#include <utility>
#include <string>
#include <stdio.h>
#include <map>
using namespace std;
#define slope(x11, y11, x22, y22) ((double)y11-(double)y22)/((double)x11-(double)x22)

bool used[1000000];

int main() {
	int n, d, h;
	cin >> n >> d >> h;
	if (h * 2 < d)
		cout << -1 << endl;
	else if (d / 2 + d % 2 > h)
		cout << -1 << endl;
	else {
		int idx = 2, q = 1, w = 2, a = h, b = d - h;
		for (int i = 0; i < a; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = q + 1;
			w = w + 1;
		}
		q = 1;
		for (int i = 0; i < b; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = w, w = w + 1;
		}
		for (int i = 1; i <= n; i++) if (!used[i])
			cout << 1 << " " << i << endl;
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>
#include <algorithm>
#include <utility>
#include <string>
#include <stdio.h>
#include <map>
using namespace std;
#define slope(x11, y11, x22, y22) ((double)y11-(double)y22)/((double)x11-(double)x22)

bool used[1000000];

int main() {
	int n, d, h;
	cin >> n >> d >> h;
	if (h * 2 < d)
		cout << -1 << endl;
	else if (d / 2 + d % 2 > h)
		cout << -1 << endl;
	else {
		int idx = 2, q = 1, w = 2, a = d / 2, b = d / 2 + d % 2;
		for (int i = 0; i < a; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = q + 1;
			w = w + 1;
		}
		q = 1;
		for (int i = 0; i < b; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = w, w = w + 1;
		}
		for (int i = 1; i <= n; i++) if (!used[i])
			cout << 1 << " " << i << endl;
	}
	return 0;
}


#define _CRT_SECURE_NO_WARNINGS
#include <vector>
#include <iostream>
#include <algorithm>
#include <utility>
#include <string>
#include <stdio.h>
#include <map>
using namespace std;
#define slope(x11, y11, x22, y22) ((double)y11-(double)y22)/((double)x11-(double)x22)

bool used[1000000];

int main() {
	int n, d, h;
	cin >> n >> d >> h;
	if (h * 2 < d)
		cout << -1 << endl;
	else if (d / 2 + d % 2 > h)
		cout << -1 << endl;
	else if (h == d && h == 1 && n > 2)
		cout << -1 << endl;
	else if (h == d && h != n - 1) {
		int q = 1, w = 2, a = h-1, b;
		for (int i = 0; i < a; i++) {
			used[q] = used[w] = 1;
			cout << q << " " << w << endl;
			q++, w++;
		}
		for (int i = w; i <= n; i++)
			cout << q << " " << w++ << endl;
	}
	else {
		int q = 1, w = 2, a = h, b = d - h;
		for (int i = 0; i < a; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = q + 1;
			w = w + 1;
		}
		q = 1;
		for (int i = 0; i < b; i++) {
			used[q] = 1;
			used[w] = 1;
			cout << q << " " << w << endl;
			q = w, w = w + 1;
		}
		for (int i = 1; i <= n; i++) if (!used[i])
			cout << 1 << " " << i << endl;
	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
	ll n,d,h;
	cin>>n>>d>>h;
	if((d>2*h) || ((d==h) && h!=(n-1)) || (h==(n-1) && d!=h) || (d==(n-1) && h!=d))
		cout<<-1<<endl;
	else
	{
		int i;
		int count=0;
		for(i=1;i<=h;i++)
		{
			cout<<i<<" "<<i+1<<endl;
			count++;
		}
		i++;
		if(d!=h)
		{
			cout<<1<<" "<<i<<endl;
			count++;
		}
		for(int j=2;j<=(d-h);j++)
		{
			cout<<i<<" "<<i+1<<endl;
			count++;
			i++;
		}
		i++;
		while(count<n-1)
		{
			cout<<1<<" "<<i<<endl;
			i++;
			count++;
		}

	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
	ll n,d,h;
	cin>>n>>d>>h;
	if((d>2*h) || (h==1 && d==1 && n!=2) || (h==(n-1) && d!=h) || (d==(n-1) && h!=d) )
		cout<<-1<<endl;
	else
	{
		int i;
		int count=0;
		for(i=1;i<=h;i++)
		{
			cout<<i<<" "<<i+1<<endl;
			count++;
		}
		i++;
			if(d!=h)
			{
				cout<<1<<" "<<i<<endl;
				count++;
			}
			for(int j=2;j<=(d-h);j++)
			{
				cout<<i<<" "<<i+1<<endl;
				count++;
				i++;
			}
			i++;
			if(d==h)
			{
				i--;
			}
			while(count<n-1)
			{
				cout<<h<<" "<<i<<endl;
				i++;
				count++;
			}

	}
	return 0;
}


#include <bits/stdc++.h>
using namespace std;
#define ll long long
int main()
{
	ll n,d,h;
	cin>>n>>d>>h;
	if((d>2*h) || (h==1 && d==1 && n!=2) || (h==(n-1) && d!=h) ) )
		cout<<-1<<endl;
	else
	{
		int i;
		int count=0;
		for(i=1;i<=h;i++)
		{
			cout<<i<<" "<<i+1<<endl;
			count++;
		}
		i++;
			if(d!=h)
			{
				cout<<1<<" "<<i<<endl;
				count++;
			}
			for(int j=2;j<=(d-h);j++)
			{
				cout<<i<<" "<<i+1<<endl;
				count++;
				i++;
			}
			i++;
			if(d==h)
			{
				i--;
			}
			while(count<n-1)
			{
				cout<<h<<" "<<i<<endl;
				i++;
				count++;
			}

	}
	return 0;
}