//Petru - Se dau n,m. Sa se aleaga un k si sa se genereze un graf neorientat cu 
//k noduri care are cel putin o componenta conexa cu exact n noduri in graful direct 
//si una cu exact m noduri in graful complementar.
//caz particular n=m=2 k=2
//oricum ai face o clica tu cand complementezi graful vei uni toate nodurile

#include <iostream>
#include <cassert>
using namespace std;

int k,n,m;

int main() {
	cin>>k>>n>>m;
	assert(n!=0 && m!=0);
	assert(n<=k && m<=k);
	assert(1<=k && k<=100);
	if(k==1) {
		cout<<0;
		return 0;
	}
	if(k!=max(n,m) || n==m){
		cout<<-1;
		return 0;
	}
	if(n<m) {
		cout<<n-1<<'\n';
		for(int i=1; i<n; ++i) cout<<0<<' '<<i<<'\n';
	}else {
		int mt[105][105];
		for(int i=0; i<k; ++i) for(int j=0; j<k; ++j) mt[i][j]=0;
		for(int i=1; i<m; ++i) mt[0][i]=1;
		int cnt=0;
		for(int i=0; i<k; ++i) for(int j=i; j<k; ++j) if(mt[i][j]==0) ++cnt;
		cout<<cnt<<'\n';
		for(int i=0; i<k; ++i) for(int j=i; j<k; ++j) if(mt[i][j]==0) cout<<i<<' '<<j<<'\n';
	}

}