//Petru - Se dau n,m. Sa se aleaga un k si sa se genereze un graf neorientat cu //k noduri care are cel putin o componenta conexa cu exact n noduri in graful direct //si una cu exact m noduri in graful complementar. //caz particular n=m=2 k=2 //oricum ai face o clica tu cand complementezi graful vei uni toate nodurile #include <iostream> #include <cassert> using namespace std; int k,n,m; int main() { cin>>k>>n>>m; assert(n!=0 && m!=0); assert(n<=k && m<=k); assert(1<=k && k<=100); if(k==1) { cout<<0; return 0; } if(k!=max(n,m) || n==m){ cout<<-1; return 0; } if(n<m) { cout<<n-1<<'\n'; for(int i=1; i<n; ++i) cout<<0<<' '<<i<<'\n'; }else { int mt[105][105]; for(int i=0; i<k; ++i) for(int j=0; j<k; ++j) mt[i][j]=0; for(int i=1; i<m; ++i) mt[0][i]=1; int cnt=0; for(int i=0; i<k; ++i) for(int j=i; j<k; ++j) if(mt[i][j]==0) ++cnt; cout<<cnt<<'\n'; for(int i=0; i<k; ++i) for(int j=i; j<k; ++j) if(mt[i][j]==0) cout<<i<<' '<<j<<'\n'; } }