Currently Tiny is learning Computational Geometry. When trying to solve a problem called "The Closest Pair Of Points In The Plane", he found that a code which gave a wrong time complexity got Accepted instead of Time Limit Exceeded.

The problem is the follows. Given n points in the plane, find a pair of points between which the distance is minimized. Distance between (x1, y1) and (x2, y2) is <image>.

The pseudo code of the unexpected code is as follows:
    
    
      
    input n  
    for i from 1 to n  
        input the i-th point's coordinates into p[i]  
    sort array p[] by increasing of x coordinate first and increasing of y coordinate second  
    d=INF        //here INF is a number big enough  
    tot=0  
    for i from 1 to n  
        for j from (i+1) to n  
            ++tot  
            if (p[j].x-p[i].x>=d) then break    //notice that "break" is only to be  
                                                //out of the loop "for j"  
            d=min(d,distance(p[i],p[j]))  
    output d  
    

Here, tot can be regarded as the running time of the code. Due to the fact that a computer can only run a limited number of operations per second, tot should not be more than k in order not to get Time Limit Exceeded.

You are a great hacker. Would you please help Tiny generate a test data and let the code get Time Limit Exceeded?

Input

A single line which contains two space-separated integers n and k (2 ≤ n ≤ 2000, 1 ≤ k ≤ 109).

Output

If there doesn't exist such a data which let the given code get TLE, print "no solution" (without quotes); else print n lines, and the i-th line contains two integers xi, yi (|xi|, |yi| ≤ 109) representing the coordinates of the i-th point.

The conditions below must be held:

  * All the points must be distinct. 
  * |xi|, |yi| ≤ 109. 
  * After running the given code, the value of tot should be larger than k. 

Examples

Input

4 3


Output

0 0
0 1
1 0
1 1


Input

2 100


Output

no solution
import java.io.*;
import java.math.*;

public class Main
{
    static Input in;
    static Output out;
    static final boolean OJ = System.getProperty("ONLINE_JUDGE") != null;

    public static void main(String[] args) throws IOException
    {
        in = new Input(OJ ? System.in : new FileInputStream("in.txt"));
        out = new Output(OJ ? System.out : new FileOutputStream("out.txt"));
        solve();
        out.close();
        System.exit(0);
    }

    private static void solve() throws IOException
    {
        int n = in.nextInt(), k = in.nextInt();
        long tot = n * (n - 1) / 2;
        if (tot > k)
        {
            for (int i = 0; i < n; i++)
            {
                out.printf("%d %d\n", 0, i);
            }
        }
        else out.println("no solution");
    }
}

class Input
{
    final int SIZE = 8192; //4096; 8192; 65536;
    InputStream in;
    byte[] buf = new byte[SIZE];
    int last, current, total;

    public Input(InputStream stream) throws IOException
    {
        in = stream; last = read();
    }

    int read() throws IOException
    {
        if (total == -1) return -1;
        if (current >= total)
        {
            current = 0; total = in.read(buf);
            if (total <= 0) return -1;
        }
        return buf[current++];
    }

    void advance() throws IOException
    {
        while (true)
        {
            if (last == -1) return;
            if (!isValidChar(last)) last = read();
            else break;
        }
    }

    boolean isValidChar(int c) { return c > 32 && c < 127; }

    public boolean endOfFile() throws IOException { advance(); return last == -1; }

    public String nextString() throws IOException
    {
        advance();
        if (last == -1) throw new EOFException();
        StringBuilder s = new StringBuilder();
        while (true)
        {
            s.appendCodePoint(last); last = read();
            if (!isValidChar(last)) break;
        }
        return s.toString();
    }

    public String nextLine() throws IOException
    {
        if (last == -1) throw new EOFException();
        StringBuilder s = new StringBuilder();
        while (true)
        {
            s.appendCodePoint(last); last = read();
            if (last == '\n' || last == -1) break;
        }
        return s.toString();
    }

    public String nextLine(boolean ignoreIfEmpty) throws IOException
    {
        if (!ignoreIfEmpty) return nextLine();
        String s = nextLine();
        while (s.trim().length() == 0) s = nextLine();
        return s;
    }

    public int nextInt() throws IOException
    {
        advance();
        if (last == -1) throw new EOFException();
        int n = 0, s = 1;
        if (last == '-')
        {
            s = -1; last = read();
            if (last == -1) throw new EOFException();
        }
        while (true)
        {
            n = n * 10 + last - '0'; last = read();
            if (!isValidChar(last)) break;
        }
        return n * s;
    }

    public long nextLong() throws IOException
    {
        advance();
        if (last == -1) throw new EOFException();
        int s = 1;
        if (last == '-')
        {
            s = -1; last = read();
            if (last == -1) throw new EOFException();
        }
        long n = 0;
        while (true)
        {
            n = n * 10 + last - '0'; last = read();
            if (!isValidChar(last)) break;
        }
        return n * s;
    }

    public BigInteger nextBigInt() throws IOException { return new BigInteger(nextString()); }

    public char nextChar() throws IOException { advance(); return (char) last; }

    public double nextDouble() throws IOException
    {
        advance();
        if (last == -1) throw new EOFException();
        int s = 1;
        if (last == '-')
        {
            s = -1; last = read();
            if (last == -1) throw new EOFException();
        }
        double n = 0;
        while (true)
        {
            n = n * 10 + last - '0'; last = read();
            if (!isValidChar(last) || last == '.') break;
        }
        if (last == '.')
        {
            last = read();
            if (last == -1) throw new EOFException();
            double m = 1;
            while (true)
            {
                m = m / 10;
                n = n + (last - '0') * m; last = read();
                if (!isValidChar(last)) break;
            }
        }
        return n * s;
    }

    public BigDecimal nextBigDecimal() throws IOException { return new BigDecimal(nextString()); }

    public int[] nextIntArray(int len) throws IOException
    {
        int[] A = new int[len];
        for (int i = 0; i < len; i++) A[i] = nextInt();
        return A;
    }

    public long[] nextLongArray(int len) throws IOException
    {
        long[] A = new long[len];
        for (int i = 0; i < len; i++) A[i] = nextLong();
        return A;
    }

    public int[][] nextIntTable(int rows, int cols) throws IOException
    {
        int[][] T = new int[rows][];
        for (int i = 0; i < rows; i++) T[i] = nextIntArray(cols);
        return T;
    }
}

class Output
{
    final int SIZE = 4096; // 4096; 8192
    Writer out;
    char[] cb = new char[SIZE];
    int nChars = SIZE, nextChar = 0;
    char lineSeparator = '\n';

    public Output(OutputStream stream) { out = new OutputStreamWriter(stream); }

    void flushBuffer() throws IOException
    {
        if (nextChar == 0) return;
        out.write(cb, 0, nextChar);
        nextChar = 0;
    }

    void write(int c) throws IOException
    {
        if (nextChar >= nChars) flushBuffer();
        cb[nextChar++] = (char) c;
    }

    void write(String s, int off, int len) throws IOException
    {
        int b = off, t = off + len;
        while (b < t)
        {
            int a = nChars - nextChar, a1 = t - b;
            int d = a < a1 ? a : a1;
            s.getChars(b, b + d, cb, nextChar);
            b += d;
            nextChar += d;
            if (nextChar >= nChars) flushBuffer();
        }
    }

    void write(String s) throws IOException { write(s, 0, s.length()); }

    public void print(Object obj) throws IOException { write(String.valueOf(obj)); }

    public void println(Object obj) throws IOException
    {
        write(String.valueOf(obj));
        write(lineSeparator);
    }

    public void printf(String format, Object... obj) throws IOException { write(String.format(format, obj)); }

    public void printElements(Object... obj) throws IOException
    {
        for (int i = 0; i < obj.length; i++)
        {
            if (i > 0) print(" ");
            print(obj[i]);
        }
        print(lineSeparator);
    }

    public void close() throws IOException
    {
        flushBuffer();
        out.close();
    }
}