#include"bits/stdc++.h"


#define PB push_back
#define PF push_front
#define LB lower_bound
#define UB upper_bound
#define fr(x) freopen(x,"r",stdin)
#define fw(x) freopen(x,"w",stdout)
#define iout(x) printf("%d\n",x)
#define lout(x) printf("%lld\n",x)
#define REP(x,l,u) for(int x = (l);x<=(u);x++)
#define RREP(x,l,u) for(int x = (l);x>=(u);x--)
#define mst(x,a) memset(x,a,sizeof(x))
#define PII pair<int,int>
#define PLL pair<ll,ll>
#define MP make_pair
#define se second
#define fi first
#define dbg(x) cout<<#x<<" = "<<(x)<<endl;
#define sz(x) ((int)x.size())
#define cl(x) x.clear()

typedef  long long ll;
typedef unsigned long long ull;
typedef double db;
typedef long double ld;
using namespace std;

const int maxn = 200010;
const int mod = 1e9+7;
const int MAX = 1000000010;
const double eps = 1e-6;
const double PI = acos(-1);

template<typename T> inline void read(T &x){
x=0;T f=1;char ch;do{ch=getchar();if(ch=='-')f=-1;}while(ch<'0'||ch>'9');do x=x*10+ch-'0',ch=getchar();while(ch<='9'&&ch>='0');x*=f;
}

template<typename A,typename B> inline void read(A&x,B&y){read(x);read(y);}
template<typename A,typename B,typename C> inline void read(A&x,B&y,C&z){read(x);read(y);read(z);}
template<typename A,typename B,typename C,typename D> inline void read(A&x,B&y,C&z,D&w){read(x);read(y);read(z);read(w);}
template<typename A,typename B> inline A fexp(A x,B p){A ans=1;for(;p;p>>=1,x=1LL*x*x%mod)if(p&1)ans=1LL*ans*x%mod;return ans;}
template<typename A,typename B> inline A fexp(A x,B p,A mo){A ans=1;for(;p;p>>=1,x=1LL*x*x%mo)if(p&1)ans=1LL*ans*x%mo;return ans;}

int N,A,B,tot0,tot1;

int Is[maxn];

int col[610][610],can[610][610],can2[610][610];

void dfs(int x,int y,int dis,int c){
	if(x<0||x>=N*2||y<0||y>=N*2)return;
	if(col[x][y]){
		assert(col[x][y]==c);
		return;
	}
	col[x][y]=c;
	if(c==1)tot1++;else tot0++;
	for(int i=0;i*i<=dis;++i)if(Is[dis-i*i]){
		int j=(int)sqrt(.5+dis-i*i);
		dfs(x+i,y+j,dis,3-c);
		dfs(x+i,y-j,dis,3-c);
		dfs(x-i,y+j,dis,3-c);
		dfs(x-i,y-j,dis,3-c);
	}
}

void dfs(int x,int y,int dis,int c,int ned){
	if(x<0||x>=N*2||y<0||y>=N*2)return;
	if(can[x][y]){
		return;
	}
	if(c==ned)can[x][y]=1;else can[x][y]=-1;
	for(int i=0;i*i<=dis;++i)if(Is[dis-i*i]){
		int j=(int)sqrt(.5+dis-i*i);
		dfs(x+i,y+j,dis,3-c,ned);
		dfs(x+i,y-j,dis,3-c,ned);
		dfs(x-i,y+j,dis,3-c,ned);
		dfs(x-i,y-j,dis,3-c,ned);
	}
}

void dfs2(int x,int y,int dis,int c){
	if(x<0||x>=N*2||y<0||y>=N*2||can[x][y]!=1)return;
	if(col[x][y]){
		assert(col[x][y]==c);
		return;
	}
	col[x][y]=c;
	if(c==1)tot1++;else tot0++;
	for(int i=0;i*i<=dis;++i)if(Is[dis-i*i]){
		int j=(int)sqrt(.5+dis-i*i);
		dfs2(x+i,y+j,dis,3-c);
		dfs2(x+i,y-j,dis,3-c);
		dfs2(x-i,y+j,dis,3-c);
		dfs2(x-i,y-j,dis,3-c);
	}
}

void dfs2(int x,int y,int dis,int c,int ned){
	if(x<0||x>=N*2||y<0||y>=N*2||can[x][y]!=1)return;
	if(can2[x][y]){
		return;
	}
	if(c==ned)can2[x][y]=1;else can2[x][y]=-1;
	for(int i=0;i*i<=dis;++i)if(Is[dis-i*i]){
		int j=(int)sqrt(.5+dis-i*i);
		dfs2(x+i,y+j,dis,3-c,ned);
		dfs2(x+i,y-j,dis,3-c,ned);
		dfs2(x-i,y+j,dis,3-c,ned);
		dfs2(x-i,y-j,dis,3-c,ned);
	}
}

void Work(){
	REP(i,0,N*2-1)REP(j,0,N*2-1)if(!col[i][j]){
		tot0=tot1=0;
		dfs(i,j,A,1);
		if(tot0>=tot1){
			dfs(i,j,A,1,2);
		}
		else dfs(i,j,A,1,1);
	}
	REP(i,0,N*2-1)REP(j,0,N*2-1)col[i][j]=0;
	REP(i,0,N*2-1)REP(j,0,N*2-1)if(!col[i][j]&&can[i][j]==1){
		tot0=tot1=0;
		dfs2(i,j,B,1);
		if(tot0>=tot1){
			dfs2(i,j,B,1,2);
		}
		else dfs2(i,j,B,1,1);
	}
	int now=N*N;
	REP(i,0,N*2-1)REP(j,0,N*2-1)if(can2[i][j]==1&&now){
		printf("%d %d\n",i,j);
		now--;
	}
}

void Init(){
	read(N,A,B);
	REP(i,0,1000)if(i*i<=200000)Is[i*i]=1;
}

int main(){
	Init();
	Work();
	return 0;
}


Measured memory_bytes: 34176