//Code by Patcas Csaba #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define LL long long #define PII pair #define VB vector #define VI vector #define VD vector #define VS vector #define VPII vector > #define VVI vector < VI > #define VVB vector < VB > #define FORN(i, n) for(int i = 0; i < (n); ++i) #define FOR(i, a, b) for(int i = (a); i <= (b); ++i) #define FORD(i, a, b) for(int i = (a); i >= (b); --i) #define REPEAT do{ #define UNTIL(x) }while(!(x)); #define SZ size() #define BG begin() #define EN end() #define CL clear() #define X first #define Y second #define RS resize #define PB push_back #define MP make_pair #define ALL(x) x.begin(), x.end() #define IN_FILE "a.in" #define OUT_FILE "a.out" int k, m, n, nrEdges = 0; VVI g; int main() { //Read data //freopen(IN_FILE, "r", stdin); //freopen(OUT_FILE, "w", stdout); cin >> k >> m >> n; if (n != 1 && m != 1) { cout << "Impossible"; return 0; } if (n == 1 && m == 1) { if (k == 1) cout << "0"; else if (k == 2 || k == 3) cout << "Impossible"; else { cout << k - 1 << endl; FOR(i, 1, k - 1) cout << i << " " << i + 1 << endl; } return 0; } //Solve g.RS(k + 1, VI(k + 1)); if (m == 1) { if (n > k) { cout << "Impossible"; return 0; } FOR(i, 1, k - n) FOR(j, i + 1, k - n + 1) { ++nrEdges; g[i][j] = 1; g[j][i] = 1; } } else { if (m > k) { cout << "Impossible"; return 0; } FOR(i, 1, k - m) FOR(j, i + 1, k - m + 1) { g[i][j] = 1; g[j][i] = 1; } FOR(i, 1, k - 1) FOR(j, i + 1, k) { g[i][j] = 1 - g[i][j]; g[j][i] = 1 - g[j][i]; if (g[i][j] == 1) ++nrEdges; } } //Write data cout << nrEdges << endl; FOR(i, 1, k - 1) FOR(j, i + 1, k) if (g[i][j]) cout << i << " " << j << endl; return 0; }