#include <cstdio>
#include <vector>
#include <set>
#include <utility>
using namespace std;
vector<pair<int,int> > al[609][609];
vector<pair<int,int> > bl[609][609];
vector<pair<int,int> > da;
vector<pair<int,int> > db;
int A[609][609];
int B[609][609];
vector<pair<int,int> > V[2][2];
void dfsa(int x, int y, int v){
A[x][y] = v;
for (auto i = al[x][y].begin(); i != al[x][y].end(); i++){
if (A[i->first][i->second]==0) dfsa(i->first,i->second,3-v);
}
}
void dfsb(int x, int y, int v){
B[x][y] = v;
for (auto i = bl[x][y].begin(); i != bl[x][y].end(); i++){
if (B[i->first][i->second]==0) dfsb(i->first,i->second,3-v);
}
}
int main(){
int N;
scanf("%d", &N);
int D1, D2;
scanf("%d %d", &D1, &D2);
{
int j = 0;
while (j*j<D1) j++;
for (int i = 0; i*i<D1; i++){
while (i*i+j*j>D1) j--;
if (i*i+j*j==D1){
da.push_back(make_pair(i,j));
da.push_back(make_pair(-i,-j));
da.push_back(make_pair(j,-i));
da.push_back(make_pair(-j,i));
}
}
j = 0;
while (j*j<D2) j++;
for (int i = 0; i*i<D2; i++){
while (i*i+j*j>D2) j--;
if (i*i+j*j==D2){
db.push_back(make_pair(i,j));
db.push_back(make_pair(-i,-j));
db.push_back(make_pair(j,-i));
db.push_back(make_pair(-j,i));
}
}
}
for (int i = 0; i < 2*N; i++){
for (int j = 0; j < 2*N; j++){
for (int k = 0; k < da.size(); k++){
int x = i+da[k].first, y = j+da[k].second;
if (x>=0&&x<2*N&&y>=0&&y<2*N){
al[i][j].push_back(make_pair(x,y));
}
}
for (int k = 0; k < db.size(); k++){
int x = i+db[k].first, y = j+db[k].second;
if (x>=0&&x<2*N&&y>=0&&y<2*N){
bl[i][j].push_back(make_pair(x,y));
}
}
}
}
for (int i = 0; i < 2*N; i++){
for (int j = 0; j < 2*N; j++){
if (A[i][j]==0) dfsa(i,j,1);
if (B[i][j]==0) dfsb(i,j,1);
V[A[i][j]-1][B[i][j]-1].push_back(make_pair(i,j));
}
}
for (int i = 0; i < 2; i++){
for (int j = 0; j < 2; j++){
if (V[i][j].size()>=N*N){
for (int k = 0; k < N*N; k++){
printf("%d %d\n", V[i][j][k].first, V[i][j][k].second);
}
return 0;
}
}
}
}