// MLC PENTRU PRIMA PROBLEMA
// NU MAI LASATI GAVRILATORUL SA PROPUNA

#include <iostream>
#include <fstream>
#include <vector>
#include <cstring>

using namespace std;

const int MAXN = 1010;

int n, m, k, used[MAXN], nr = 0;
vector<pair<int, int> > sol;
vector<int> g[MAXN], g2[MAXN];

void bf (int nod, vector<int> 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<int> 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;
}