#include <cassert>
#include <cstring>
#include <iostream>
#include <algorithm>

using namespace std;

int K, M, N;
bool is[52][52];
bool S[52];

void revert()
{
	for (int i = 1; i <= K; ++i)
		for (int j = 1; j <= K; ++j)
			if (i != j)
				is[i][j] = !is[i][j];
}

int now;
void Dfs(int x)
{
	S[x] = true;
	++now;
	for (int i = 1; i <= K; ++i)
		if (is[x][i] && !S[i])
			Dfs(i);
}
bool iscomp(int x)
{
	memset(S, 0, sizeof(S));
	for (int i = 1; i <= K; ++i)
		if (!S[i])
		{
			now = 0;
			Dfs(i);
			if (now == x) return true;
		}
	return false;
}
void printgraf()
{
	int edge = 0;
	for (int i = 1; i <= K; ++i)
		for (int j = i + 1; j <= K; ++j)
			if (is[i][j])
				++edge;
	cout << edge << '\n';
	
	for (int i = 1; i <= K; ++i)
		for (int j = i + 1; j <= K; ++j)
			if (is[i][j])
				cout << i << ' ' << j << '\n';
}

int main()
{
	cin.sync_with_stdio(false);
	
	cin >> K >> N >> M;
	assert(K == 3 && N == 1 && M == 1);
	if (M != K && N != K)
		cout << -1 << '\n';
	else if (N == K)
	{
		for (int i = 1; i <= K; ++i)
			for (int j = i + 1; j <= K; ++j)
				is[i][j] = is[j][i] = true;
		for (int i = 1; i <= M - 1; ++i)
			is[i][i + 1] = is[i + 1][i] = false;
		
		if (iscomp(N))
		{
			revert();
			if (iscomp(M))
			{
				revert();
				printgraf();
				return 0;
			}
		}
		
		cout << -1 << '\n';
	}
	else
	{
		for (int i = 1; i <= N - 1; ++i)
			is[i][i + 1] = is[i + 1][i] = true;
		if (iscomp(N))
		{
			revert();
			if (iscomp(M))
			{
				revert();
				printgraf();
				return 0;
			}
		}
		
		cout << -1 << '\n';
	}
}