#include <bits/stdc++.h>

using namespace std;
typedef long long int ll;
typedef unsigned int uint;
typedef unsigned char uchar;
typedef unsigned long long ull;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef vector<int> vi;

#define REP(i, x) for(int i=0;i<(int)(x);i++)
#define REPS(i, x) for(int i=1;i<=(int)(x);i++)
#define RREP(i, x) for(int i=((int)(x)-1);i>=0;i--)
#define RREPS(i, x) for(int i=((int)(x));i>0;i--)
#define FOR(i, c) for(__typeof((c).begin())i=(c).begin();i!=(c).end();i++)
#define RFOR(i, c) for(__typeof((c).rbegin())i=(c).rbegin();i!=(c).rend();i++)
#define ALL(container) (container).begin(), (container).end()
#define RALL(container) (container).rbegin(), (container).rend()
#define SZ(container) ((int)container.size())
#define mp(a, b) make_pair(a, b)
#define pb push_back
#define eb emplace_back
#define UNIQUE(v) v.erase( unique(v.begin(), v.end()), v.end() );

template<class T>
bool chmax(T &a, const T &b) {
    if (a < b) {
        a = b;
        return 1;
    }
    return 0;
}

template<class T>
bool chmin(T &a, const T &b) {
    if (a > b) {
        a = b;
        return 1;
    }
    return 0;
}

template<class T>
ostream &operator<<(ostream &os, const vector<T> &t) {
    os << "[";
    FOR(it, t) {
        if (it != t.begin()) os << ",";
        os << *it;
    }
    os << "]";
    return os;
}

template<class T>
ostream &operator<<(ostream &os, const set<T> &t) {
    os << "{";
    FOR(it, t) {
        if (it != t.begin()) os << ",";
        os << *it;
    }
    os << "}";
    return os;
}

template<class S, class T>
ostream &operator<<(ostream &os, const pair<S, T> &t) { return os << "(" << t.first << "," << t.second << ")"; }

template<class S, class T>
pair<S, T> operator+(const pair<S, T> &s, const pair<S, T> &t) {
    return pair<S, T>(s.first + t.first, s.second + t.second);
}

template<class S, class T>
pair<S, T> operator-(const pair<S, T> &s, const pair<S, T> &t) {
    return pair<S, T>(s.first - t.first, s.second - t.second);
}

const int INF = 1 << 28;
const double EPS = 1e-8;
const int MOD = 1000000007;


int T, n, d1, d2;

vector<vi> color(int d) {
    set<pii> no;
    REP(x, 600) {
        int y2 = d - x * x;
        if (y2 < 0) continue;
        int y = sqrt(y2 + EPS);
        if (y * y == y2) {
            no.emplace(x, y);
            no.emplace(x, -y);
            no.emplace(-x, y);
            no.emplace(-x, -y);
        }
    }
    vector<vi> v(2*n, vi(2*n));
    int c = n * n;
    REP(oy, 2 * n) {
        REP(ox, 2 * n) {
            if (v[oy][ox]) continue;
            queue<pii> q;
            q.emplace(oy, ox);
            v[oy][ox] = 1;
            while(!q.empty()) {
                int y, x; tie(y, x) = q.front(); q.pop();
                for (auto e : no) {
                    int dy = y + e.first;
                    int dx = x + e.second;
                    if (dy < 0 || dx < 0 || 2 * n <= dy || 2 * n <= dx || v[dy][dx]) continue;
                    v[dy][dx] = -v[y][x];
                    q.emplace(dy, dx);
                }
            }
        }
    }
    return v;
}

int main(int argc, char *argv[]) {
    ios::sync_with_stdio(false);
    cin >> n >> d1 >> d2;
    auto v1 = color(d1);
    auto v2 = color(d2);
    vector<vector<pii>> ans(4);
    REP(x, 2 * n) {
        REP(y, 2 * n) {
            ans[(v1[y][x] == 1) | ((v2[y][x] == 1) << 1)].emplace_back(y, x);
        }
    }
    sort(RALL(ans), [](const auto &v1, const auto &v2) {
        return v1.size() < v2.size();
    });
    REP(i, n * n) cout << ans[0][i].first << " " << ans[0][i].second << endl;
    return 0;
}


Measured memory_bytes: 8036