#include <cstdio> #include <iostream> #include <fstream> #include <vector> #include <list> #include <map> #include <set> #include <queue> #include <stack> #include <bitset> #include <algorithm> #include <sstream> #include <iomanip> #include <cmath> #include <cstdlib> #include <cctype> #include <cstring> #include <string> #include <ctime> #include <cassert> #include <utility> using namespace std; #define MAXN 105 int K, N, M; int A[MAXN][MAXN]; vector<pair<int, int> > edges; void addEdge(int a, int b) { A[a][b] = 1 - A[a][b]; A[b][a] = 1 - A[b][a]; } int main() { // freopen("date.in", "r", stdin); // freopen("date.out","w", stdout); cin >> K >> N >> M; if(K == 1) { cout << 0 << '\n'; return 0; } if(N < K) { if(M < K) { cout << -1 << '\n'; return 0; } else { // M=K for(int i = 0; i < N - 1; i++) addEdge(i, i + 1); } } else { // N=K if(M == K) { cout << -1 << '\n'; return 0; } else { // M<K for(int i = 0; i < K; i++) for(int j = 0; j < K; j++) A[i][j] = 1; for(int i = 0; i < M - 1; i++) addEdge(i, i + 1); } } for(int i = 0; i < K; i++) for(int j = i + 1; j < K; j++) if(A[i][j] == 1) edges.push_back(make_pair(i, j)); cout << (int)edges.size() << '\n'; for(vector<pair<int, int> > :: iterator it = edges.begin(); it != edges.end(); it++) cout << it->first + 1 << " " << it->second + 1 << '\n'; return 0; }