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: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;

namespace E_ABC131
{
    class MainClass
    {

        static int[] s;

        public static void Main(string[] args)
        {
            s = Array.ConvertAll(Console.ReadLine().Split().ToArray(), int.Parse);
            if (s[1] > ((s[0] - 1) * (s[0] - 2) / 2))
            {
                Console.WriteLine(-1);
                return;
            }
            var v = new List<int[]>();
            for (int i = 1; i < s[0]; i++)
            {
                int[] uv = new int[2] { i, s[0] };
                v.Add(uv);
            }
            int cnt = (s[0] - 1) * (s[0] - 2) / 2 - s[1];
            if (cnt == 0)
            {
                Console.WriteLine(v.Count);
                for (int k = 0; k < v.Count; k++)
                {
                    Console.WriteLine("{0} {1}", v[k][0], v[k][1]);
                }
                return;
            }
            for (int i = 1; i < s[0]; i++)
            {
                for (int j = s[0] - 1; j > i; j--)
                {
                    int[] uv = new int[2] { i, j };
                    v.Add(uv);
                    cnt--;
                    if (cnt == 0)
                    {
                        Console.WriteLine(v.Count);
                        for (int k = 0; k < v.Count; k++)
                        {
                            Console.WriteLine("{0} {1}", v[k][0], v[k][1]);
                        }
                        return;
                    }

                }


            }
            Console.WriteLine(v.Count);
            for (int k = 0; k < v.Count; k++)
            {
                Console.WriteLine("{0} {1}", v[k][0], v[k][1]);
            }
            return;

        }
    }
}