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# (Mono 4.6.2.0) (judge verdict: Wrong Answer)

using System;
using System.Collections.Generic;

namespace abc131_e
{
    class Program
    {
        static void Main(string[] args)
        {
            var items = Console.ReadLine().Split(' ');
            // 頂点数
            var n = int.Parse(items[0]);
            // 長さ2のペア
            var k = int.Parse(items[1]);

            // a_b   :aとbは長さ1
            // a_._b :aとbは長さ2
            // つまり、こんな感じのグラフになる
            // .        1 0 0
            // ._.      2 0 1
            // ./_.     3 1 2
            // .//_.    4 3 3
            // ./_/_.   5 3
            // .//_._.  5 3
            // .///_.   5 6 4
            // .///_.   i+1 i-1+i-2+...+2+1 i

            // まず、1番目の点に頂点を連結して、長さ2のやつを作る
            // 1につながる頂点が1増えると、i-1通りのkが増える
            // kに必要な頂点数は、
            // 1=1=(1+1)*1/2
            // 3=2+1=(2+1)*2/2
            // 6=3+2+1=(3+1)*3/2
            // 10=4+3+2+1=(4+1)*4/2
            // k=(i-1)+(i-2)+...+2+1
            // k=(i-1+1)*(i-1)/2
            // k=i*(i-1)/2
            // 2k=i*(i-1)

            // 追加した辺
            var lines = new List<line>();
            // 1-2は初めから追加しておく
            lines.Add(new line { u = 1, v = 2 });
            // 算出したkの数
            var kk = 0;
            var valid = false;
            for (int i = 0; i < n; i++)
            {
                lines.Add(new line { u = 1, v = i + 3 });
                kk += i + 1;
                // 使った頂点数がnを超えた
                if (lines.Count + 1 > n)
                {
                    valid = false;
                    break;
                }
                // kは2ペアを作れる値
                if (kk == k)
                {
                    valid = true;
                    break;
                }
                // kは2ペアを作れない値
                if (kk > k)
                {
                    valid = false;
                    break;
                }
            }

            if (!valid)
            {
                // 成立しない
                lines.Clear();
            }
            else
            {
                // 成立してたら、頂点の数を調整する
                // 1以外の適当な頂点に余りを接続する
                // 今回は、2につなげる
                var count = lines.Count + 1;
                for (int i = 0; i < n - count; i++)
                {
                    lines.Add(new line { u = 2, v = count + 1 + i });
                }
            }

            var m = lines.Count == 0 ? -1 : lines.Count;
            Console.WriteLine($"{m}");
            for (int i = 0; i < m; i++)
            {
                Console.WriteLine($"{lines[i].u} {lines[i].v}");
            }
        }
    }
    struct line
    {
        public int u;
        public int v;
    }
}