Problem:
Score: 500 points

Problem Statement

Does there exist an undirected graph with N vertices satisfying the following conditions?

The graph is simple and connected.

The vertices are numbered 1, 2, ..., N.

Let M be the number of edges in the graph. The edges are numbered 1, 2, ..., M, the length of each edge is 1, and Edge i connects Vertex u_i and Vertex v_i.

There are exactly K pairs of vertices (i,\ j)\ (i < j) such that the shortest distance between them is 2.

If there exists such a graph, construct an example.

Constraints

All values in input are integers.

2 \leq N \leq 100

0 \leq K \leq \frac{N(N - 1)}{2}

Input

Input is given from Standard Input in the following format:

N K

Output

If there does not exist an undirected graph with N vertices satisfying the conditions, print -1.

If there exists such a graph, print an example in the following format (refer to Problem Statement for what the symbols stand for):

M
u_1 v_1
:
u_M v_M

If there exist multiple graphs satisfying the conditions, any of them will be accepted.

Sample Input 1

5 3

Sample Output 1

5
4 3
1 2
3 1
4 5
2 3

This graph has three pairs of vertices such that the shortest distance between them is 2: (1,\ 4), (2,\ 4), and (3,\ 5). Thus, the condition is satisfied.

Sample Input 2

5 8

Sample Output 2

-1

There is no graph satisfying the conditions.

Solution in C++14 (GCC 5.4.1) (judge verdict: Wrong Answer)

#include <bits/stdc++.h>
using namespace std;
 
#define rep(i, n) for (int i = (int)(0); i < (int)(n); ++i)
#define reps(i, n) for (int i = (int)(1); i <= (int)(n); ++i)
#define coutd(d) cout<<std::setprecision(10)<<d<<endl;
using ll = long long;
using vi = vector<int>;
using pii = pair<int, int>;
 
template<class T> inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; }
template<class T> inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; }
 
int GCD(int a, int b) { return b ? GCD(b, a%b) : a; }
int LCM(int a, int b) { return a * b / GCD(a, b); }

signed main()
{
  int n,k;
  cin>>n>>k;
  int ma=(n-1)*(n-2)/2;
  if(ma<k||n<3){
    cout<<-1<<endl;
    return 0;
  }
  int diff=ma-k;
  int rem=0;
  cout<<n-1+diff<<endl;
  reps(i,n+diff){
    if(i>2*(n-1)){
      rem=n+diff-2*(n-1);
      break;
    }
    else if(i>=n) {
      if(i==2*(n-1)) cout<<i-(n-1)<<" "<<1<<endl;
      else cout<<i-(n-1)<<" "<<1+i-(n-1)<<endl;
    }
    else cout<<n<<" "<<i<<endl;
  }
  
  int dist=2;
  reps(i,rem-1){
    if(i!=1) if((i-1)%(n-1)==0) dist++;
    int p=i%(n-1);
    if(p==0)p=(n-1);
    int c=(p+dist)%(n-1);
    if(c==0)c=(n-1);
    cout<<p<<" "<<c<<endl;
  }
}