#include using namespace std; const int IMPOSSIBLE = -1; #define MAXN 105 int K, N, M; int A[MAXN][MAXN]; void addEdge(int a, int b) { A[a][b] = A[b][a] = 1; } void removeEdge(int a, int b) { A[a][b] = A[b][a] = 0; } void printGraph() { int cnt = 0; for (int i = 0; i < K; i++) { for (int j = i + 1; j < K; j++) { cnt += A[i][j]; } } cout << cnt << '\n'; for (int i = 0; i < K; i++) { for (int j = i + 1; j < K; j++) { if (A[i][j] == 1) { cout << i + 1 << ' ' << j + 1 << '\n'; } } } } int main() { // assert(freopen("grafpetru.in", "r", stdin)); // assert(freopen("grafpetru.out", "w", stdout)); cin.sync_with_stdio(false); cin >> K >> N >> M; if (2 <= K && K <= 3 && N == K && M == K) { cout << IMPOSSIBLE << endl; } else { if (N == K) { for (int i = 0; i < K; i++) { for (int j = i + 1; j < K; j++) { addEdge(i, j); } } int i = 0; int comp = 1; while (comp < M) { removeEdge(i, i + 1); comp++; i++; } printGraph(); } else if (M == K) { int i = 0; int comp = 1; while (comp < N) { addEdge(i, i + 1); comp++; i++; } printGraph(); } else { cout << IMPOSSIBLE << endl; } } return 0; }