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;
using System.IO;
using System.Linq;

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]);

            // すべての頂点を1に連結した時のkは(n-1)*(n-2)/2。この時のkが最大
            var max = (n - 1) * (n - 2) / 2;

            if (max < k)
            {
                // kが最大より大きいときは成立しない
                Console.WriteLine($"{-1}");
            }
            else
            {
                // グラフ内の距離は、頂点間の最短距離のことである。
                // a-b-cがV字の場合はa-b、b-cが距離1でa-cが距離2。
                // a-b-cが三角形の場合は、a-b、b-c、c-aのいずれも距離1。
                // つまり、V字に辺を張って三角形にしていけば、距離2の頂点をひとつづつ減らすことができる
                // すべての頂点がつながっているグラフは、距離1のみ→kの最小値はこれ(mの最大値でもある)

                // Vから三角にするために張らなければいけない辺の数
                var sub = max - k;
                // すべての辺の数(1に連結した頂点+Vから三角の辺)
                var m = (n - 1) + sub;

                Console.WriteLine($"{(m)}");
                var umax = m / n;
                var vmax = m % n;
                for (int u = 1; u <= umax; u++)
                {
                    for (int v = u + 1; v <= n; v++)
                    {
                        Console.WriteLine($"{u} {v}");
                    }
                }
                for (int v = umax + 1; v <= vmax; v++)
                {
                    Console.WriteLine($"{umax} {v}");
                }
            }
        }
    }
}