#include #include #include 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; 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(M)) { revert(); if (iscomp(N)) { revert(); printgraf(); return 0; } } cout << -1 << '\n'; } }