// MLC PENTRU PRIMA PROBLEMA // NU MAI LASATI GAVRILATORUL SA PROPUNA #include #include #include #include using namespace std; const int MAXN = 1010; int n, m, k, used[MAXN], nr = 0; vector > sol; vector g[MAXN], g2[MAXN]; void bf (int nod, vector g[MAXN]) { used[nod] = 1; ++nr; for (int i = 0; i < g[nod].size(); ++i) { int node = g[nod][i]; if (!used[node]) bf (node, g); } } int comp (vector g[MAXN]) { int best = 0; memset (used, 0, sizeof used); for (int i = 1; i <= k; ++i) if (!used[i]) { nr = 0; bf (i, g); if (nr > best) best = nr; } return best; } int main() { cin >> k >> n >> m; n -= 1; for (int i = 1; i <= n; ++i) { g[i].push_back(i + 1); g[i + 1].push_back(i); sol.push_back(make_pair(i, i + 1)); for (int j = 1; j <= k; ++j) { if (j == i + 1 || j == i - 1) continue; g2[i].push_back(j); g2[j].push_back(i); } } if (n < k) for (int j = 1; j <= k; ++j) { if (j == n) continue; g2[n + 1].push_back(j); g2[j].push_back(n + 1); } for (int i = n + 2; i <= k; ++i) for (int j = 1; j <= k; ++j) { g2[i].push_back(j); g2[j].push_back(i); } if (comp(g2) != m) { cout << -1; return 0; } cout << sol.size() << "\n"; for (int i = 0; i < sol.size(); ++i) cout << sol[i].first << " " << sol[i].second << "\n"; return 0; }