#include <iostream>
#include <vector>
#include <utility>

using namespace std;

vector<pair<int,int> > muchii;

int main()
{
    int k,n,m,i,j;
    cin>>k>>m>>n;

    if(k<4) //Cazurile cu 1 nod, 2 noduri, si respectiv 3 noduri sunt particulare, existand mai putine solutii decat in cazul general pentru cazul n=m=1.
        if(k>1 && n==1 && m==1)
        {
            cout<<"Impossible\n";
            return 0;
        }

    if(n>1 && m>1) //Se demonstreaza usor ca in acest caz nu exista solutie. De asemenea, mai stim ca ca n>0, m>0, n<=k si m<=k, deci nu mai avem de tratat aceste cazuri particulare.
    {
        cout<<"Impossible\n";
        return 0;
    }
    else if(n==1) //n==1 && m>1 => Avem de construit un graf conex, cu m componente conexe in graful complementar.
    {
        //Construim un lant in graful complementar si restul de componente conexe in graful complementar vor fi noduri izolate.
        for(i=1;i<=k;i++)
            for(j=i+1;j<=k;j++)
                if(!(j==(i+1) && j<=(k-m+1)))
                    muchii.push_back(make_pair(i,j));
    }
    else //m==1 && n>1 => Avem de construit un graf cu n componente conexe, al caraui comlementar sa fie conex.
    {
        //Construim un lant in graful direct si restul de componente conexe in graful direct vor fi noduri izolate.
        for(i=2;i<=(k-n+1);i++)
            muchii.push_back(make_pair(i-1,i));
    }

    //Afisam numarul de drumuri ce urmeaza a fi modernizate.
    cout<<muchii.size()<<'\n';

    //Afisam drumurile propriu-zise.
    vector<pair<int,int> >::iterator it;
    for(it=muchii.begin();it!=muchii.end();it++)
        cout<<it->first<<' '<<it->second<<'\n';

    return 0;
}