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 kk = (n - 1) * (n - 2) / 2;

            // グラフ内の距離は、頂点間の最短距離のことである。
            // 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の最大値でもある)

            var lines = new List<line>();
            if (kk >= k)
            {
                // 1ループ目で、すべての頂点を1に連結する
                for (int v = 2; v <= n; v++)
                {
                    lines.Add(new line(1, v));
                }
                // 2ループ目以降で、1以外の頂点同士を連結してkを減らしていく
                for (int u = 2; u <= n; u++)
                {
                    for (int v = u + 1; v <= n; v++)
                    {
                        lines.Add(new line(u, v));
                        kk--;
                        if (kk <= k)
                        {
                            break;
                        }
                    }
                    if (kk <= k)
                    {
                        break;
                    }
                }
            }

            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 : IComparable<line>
    {
        public int u;
        public int v;
        public line(int u, int v)
        {
            this.u = Math.Min(u, v);
            this.v = Math.Max(u, v);
        }
        public int CompareTo(line other)
        {
            var c = u.CompareTo(other.u);
            if (c == 0)
            {
                c = v.CompareTo(other.v);
            }
            return c;
        }
    }
}