#include using namespace std; const char IMPOSSIBLE[] = "Impossible"; #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("grafcandrei.in", "r", stdin)); // assert(freopen("grafcandrei.out", "w", stdout)); cin.sync_with_stdio(false); cin >> K >> M >> N; if (2 <= K && K <= 3 && N == 1 && M == 1) { cout << IMPOSSIBLE << endl; } else { if (N == 1) { for (int i = 0; i < K; i++) { for (int j = i + 1; j < K; j++) { addEdge(i, j); } } int i = 0; int comp = K; while (comp > M) { removeEdge(i, i + 1); comp--; i++; } printGraph(); } else if (M == 1) { int i = 0; int comp = K; while (comp > N) { addEdge(i, i + 1); comp--; i++; } printGraph(); } else { cout << IMPOSSIBLE << endl; } } return 0; }