/*
ID: skylove3
PROG: ariprog
LANG: C++
*/
#include<iostream>
#include<algorithm>
#include<fstream>
#include<cstring>
using namespace std;
//=========================================
struct Point//记录符合条件的坐标
{
	int x;
	int y;
};
Point s[130000];//数组开小了,剪枝
int cmp( const void *a , const void *b )//结构体排序,妙
{    
	 struct Point *c = (Point *)a;
     struct Point *d = (Point *)b;
     if(c->y != d->y) 
	 return c->y - d->y;
     else return c->x - d->x;
}
Point q;
int length,M;
int p[130000];
int mark[130000];
int k=0;
void Search(const int &a,const int &b,const int &n)
{
	if(n==length)//出口
	{
		q.x=a;
		q.y=b;
		s[k]=q;
		k++;
		return ;
	}
	else
	{
		if(mark[a+n*b]==1)//标记
		{
			Search(a,b,n+1);
		}
		else
		{
			return;
		}
	}
}
int main()
{
	ofstream fout("ariprog.out");
	ifstream fin("ariprog.in");
	fin>>length>>M;
    memset(p,0,sizeof(p));
	int t=1;
	for(int i=0;i<=M;++i)
	{
		for(int j=0;j<=M;++j)
		{  
			p[t]=i*i+j*j;
			mark[p[t]]=1;
			t++;
		}
	}
	for(int i=1;i<=(M+1)*(M+1);++i)
	{
		for(int j=1;j<=(M+1)*(M+1)/2;++j)
		{
			if(i+(length-1)*j>2*(M+1)*(M+1))//剪枝,此处在主程序中
			{
				break;
			}
		    Search(p[i],j,1);
		}
	}
	int flag=0;
	int sum=0;
	for(int i=0;i<1000;i++)
	{
		if(s[i].x==0&&s[i].y==0)
		{   
			sum=i+1;
			break;
		}
	}
	
	for(int i=0;i<sum;++i)
	{
		if(s[i].x!=0||s[i].y!=0)
		{
			flag=1;
			break;
		}
	}
	if(flag==0)
	{
		fout<<"NONE"<<endl;
		return 0;
	}
	qsort(s,sum,sizeof(s[0]),cmp);
	for(int i=0;i<sum;++i)
	{
		if((s[i].x==0&&s[i].y==0)||(s[i].x==s[i-1].x&&s[i].y==s[i-1].y))
		{
			continue;
		}
		fout<<s[i].x<<" "<<s[i].y<<endl;
	}
}