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 JavaScript (node.js v5.12) (judge verdict: Wrong Answer)

var obj = init();
Main();
function nextInt(){return myconv(next(),1);}
function nextStrArray(){return myconv(next(),2);}//半角スペース分割
function nextIntArray(){return myconv(next(),4);}//半角スペース + 数値化
function nextCharArray(){return myconv(next(),6);}//1文字分割
function next(){return obj.next();}
function hasNext(){return obj.hasNext();}
function myin(){return require("fs").readFileSync("/dev/stdin", "utf8").trim().split("\n");}
function init(){
  var inputFile = myin();
  var returnObj = {
    "list" : inputFile, "index" : 0, "max" : inputFile.length,
    "hasNext" : function(){return (this.index < this.max);},
    "next" : function(){if(!this.hasNext()){throw "ArrayIndexOutOfBoundsException これ以上ないよ";}else{var returnInput = this.list[this.index];this.index++;return returnInput;}}
  };
  return returnObj;
}
function myout(t){console.log(t);}//標準出力
function myerr(t){console.error(t);}//標準エラー出力
//[no]要素の扱い。数値型
//不明値、異常時:引数そのまま返す　1:数値へ変換
//2:半角SPで分割 4:半角SPで分割し、数値配列へ
//6:1文字で分割  7:1文字で分割し、数値配列へ
//8:半角SPで結合 9:改行で結合 0:文字なしで結合
function myconv(i,no){try{switch(no){case 1:return parseInt(i);case 2:return i.split(" ");case 4:return i.split(" ").map((a)=>Number(a));case 6:return i.split("");case 7:return i.split("").map((a)=>Number(a));case 8:return i.join(" ");case 9:return i.join("\n");case 0:return i.join("");default:return i;}}catch(e){return i;}}
function Main(){
  var one = nextIntArray();
  var N = one[0];
  var K = one[1];
  var isOdd = false;
  if(N % 2 == 1){
    isOdd = true;
  }
  var mae = [];
  var ato = [];
  var center;
  if(isOdd){
    center = Math.ceil(N / 2);
  }else{
    center = (N / 1) + 1
  }
  for(var i = 1; i <= center; i++){
    mae.push(i);
  }
  for(var i = center; i <= N; i++){
    ato.push(i);
  }
  var strokePathCount = ((N * (N - 1)) / 2) - K;
  var strokePathMae = ((mae.length * (mae.length - 1)) / 2);
  var strokePathAto = ((ato.length * (ato.length - 1)) / 2);
  if(strokePathCount < strokePathMae + strokePathAto){
    myout(-1);
    return;
  }
  var output = [];
  for(var i = 0; i < mae.length - 1; i++){
    for(var j = i + 1; j < mae.length; j++){
      output.push(mae[i] + " " + mae[j]);
    }
  }
  for(var i = 0; i < ato.length - 1; i++){
    for(var j = i + 1; j < ato.length; j++){
      output.push(ato[i] + " " + ato[j]);
    }
  }
  //myerr(strokePathCount);
  //myerr(output);
  while(strokePathCount > output.length){
    var isBreak = false;
    for(var i = 0; i < mae.length; i++){
      if(isBreak){
        break;
      }
      for(var j = 0; j < ato.length; j++){
        if(center != mae[i] && center != ato[j] && mae[i] != ato[j]){
          output.push(mae[i] + " " + ato[j]);
          if(strokePathCount == output.length){
            isBreak = true;
            break;
          }
        }
      }
    }
    if(isBreak){
      break;
    }
  }
  myout(output.length);
  myout(myconv(output,9));
}