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.awt.Point;
import java.io.*;
import java.math.BigInteger;
import java.util.*;
import java.util.Map.Entry;

import static java.lang.Math.*;

public class Solve implements Runnable{
    
final boolean ONLINE_JUDGE = System.getProperty("ONLINE_JUDGE") != null;
    
    BufferedReader in;
    PrintWriter out;
    StringTokenizer tok = new StringTokenizer("");
    
    void init() throws FileNotFoundException{
        if (ONLINE_JUDGE){
            in = new BufferedReader(new InputStreamReader(System.in));
            out = new PrintWriter(System.out);
        }else{            
            in = new BufferedReader(new FileReader("input.txt"));
            out = new PrintWriter("output.txt");
        }
    }
    
    String readString() throws IOException{
        while(!tok.hasMoreTokens()){
            try{
                tok = new StringTokenizer(in.readLine());
            }catch (Exception e){
                return null;
            }
        }
        return tok.nextToken();
    }
    
    int readInt() throws IOException{
        return Integer.parseInt(readString());
    }
    
    long readLong() throws IOException{
        return Long.parseLong(readString());
    }
    
    double readDouble() throws IOException{
        return Double.parseDouble(readString());
    }
    
    public static void main(String[] args){
        new Thread(null, new Solve(), "", 256 * (1L << 20)).start();
    }
    
    long timeBegin, timeEnd;

    void time(){
        timeEnd = System.currentTimeMillis();
        System.err.println("Time = " + (timeEnd - timeBegin));
    }
    
    void debug(Object... objects){
        if (!ONLINE_JUDGE){
            for (Object o: objects){
                System.err.println(o.toString());
            }
        }
    }
    
    int sm(int x){
        if (x==1) return 0;else return 1;
    }
    
    int gcd(int a,int b){
        if (b==0) return a;
        else{
            return gcd(b,a%b);
        }
    }  
    
    
  
   
   
    
    
    
    
    void psevdokod() throws IOException{
        int n=readInt();
        int[] x=new int[n];
        int[] y=new int[n];
        
        for (int i=0;i<n;i++){
            x[i]=readInt();
            y[i]=readInt();         
        }
        //O(n*(n-1)/2)
        double d=Double.MAX_VALUE;
        int tot=0;
        for (int i=0;i<n;i++){
            for (int j=i+1;j<n;j++){
                tot++;
                if (x[j]-x[i]>=d){
                    break;
                }
                d=Math.min(d, Math.sqrt((x[j]-x[i])*(x[j]-x[i])+(y[j]-y[i])*(y[j]-y[i])));
                
            }
        }
        
        out.println(tot);
               
    }
    void solve() throws IOException{
        int n=readInt();
        int k=readInt();
        int k1=n*(n-1);
        int k2=k*2;
        if (k1<=k2){
            out.println("no solution");
            return;
        }
                
        for (int i=0;i<n;i++){
            int x=n-i;
            out.println(n+" "+x);
        }
        
        
        
        
    }
        
        
        
    
    
    public void run(){
        try{
            timeBegin = System.currentTimeMillis();
            init();
            solve();
            //psevdokod();
            out.close();
            time();
        }catch (Exception e){
            e.printStackTrace(System.err);
            System.exit(-1);
        }
    }
    
    
}