#include <bits/stdc++.h>

using namespace std;

#define REP(i,n) for(ll (i) = (0);(i) < (n);++i)
#define REV(i,n) for(ll (i) = (n) - 1;(i) >= 0;--i)
#define PB push_back
#define EB emplace_back
#define MP make_pair
#define FI first
#define SE second
#define SHOW1d(v,n) {REP(WW,n)cerr << v[WW] << ' ';cerr << endl << endl;}
#define SHOW2d(v,WW,HH) {REP(W_,WW){REP(H_,HH)cerr << v[W_][H_] << ' ';cerr << endl;}cerr << endl;}
#define ALL(v) v.begin(),v.end()
#define Decimal fixed<<setprecision(20)
#define INF 1000000000
#define LLINF 1000000000000000000LL
#define MOD 998244353

typedef long long ll;
typedef pair<ll,ll> P;

typedef complex<double> point;
const double EPS = 1e-12;

namespace std {
	bool operator < (const point& a, const point& b) {
		return real(a) != real(b) ? real(a) < real(b) : imag(a) < imag(b);
	}

	bool operator == (const point& a,const point& b) {
		return (abs(a.real() - b.real()) < EPS && abs(a.imag() - b.imag()) < EPS);
	}
}

struct segment : public vector<point> {
	segment(const point &a, const point &b) {
		push_back(a); push_back(b);
	}
};

double cross(const point& a, const point& b) {
	return imag(conj(a)*b);
}
//交点
point crosspoint(const segment &l, const segment &m) {
	double A = cross(l[1] - l[0], m[1] - m[0]);
	double B = cross(l[1] - l[0], l[1] - m[0]);
	if (abs(A) < EPS && abs(B) < EPS) return m[0]; // same line
	if (abs(A) < EPS) return point(INF,INF); // !!!PRECONDITION NOT SATISFIED!!!
	return m[0] + B / A * (m[1] - m[0]);
}

bool check(ll x1, ll y1, ll x2, ll y2, ll k){
	ll dist = abs(x1 - x2) + abs(y1 - y2);
	return dist == k;
}

ll dx[] = {1, 0, -1 ,0};
ll dy[] = {0, 1, 0, -1};

int main(){
	cin.tie(0);cout.tie(0);ios::sync_with_stdio(false);

	ll k, x, y;cin >> k >> x >> y;
	if(k % 2 == 0 && (abs(x) + abs(y)) % 2){
		cout << -1 << endl;
		return 0;
	}

	vector<P> ans;
	ll now_x = 0;
	ll now_y = 0;

	while(now_x != x || now_y != y){
		ll dist = abs(x - now_x) + abs(y - now_y);
		//cout << now_x << " " << now_y << " " << dist << endl;
		bool flag = false;
		if(dist != k && dist < 2 * k){
			REP(ii, 4){
				REP(jj, 4){
					if(flag)continue;
					segment A = segment(point(x + dx[ii] * k, y + dy[ii] * k), point(x + dx[(ii+1)%4] * k, y + dy[(ii+1)%4] * k));
					segment B = segment(point(now_x + dx[jj] * k, now_y + dy[jj] * k), point(now_x + dx[(jj+1)%4] * k, now_y + dy[(jj+1)%4] * k));
					point kouten = crosspoint(A, B);
					int xx = real(kouten);
					int yy = imag(kouten);
					if(xx != real(kouten) || yy != imag(kouten))continue;
					if(xx == INF)continue;
					if(abs(now_x - xx) + abs(now_y - yy) != k)continue;
					if(abs(x - xx) + abs(y - yy) != k)continue;
					//cout << " cross " << xx << " " << yy << endl;
					now_x = xx;
					now_y = yy;
					flag = true;
				}
			}
		}
		if(!flag) {
			ll tmp = k;
			ll tmp_x = min(tmp, abs(x - now_x));
			tmp -= tmp_x;
			ll tmp_y = tmp;
			if(now_x > x)tmp_x = -tmp_x;
			if(now_y > y)tmp_y = -tmp_y;
			now_x += tmp_x;
			now_y += tmp_y;
			//cout << " " << tmp_x << " " << tmp_y << endl;
		}

		ans.EB(now_x, now_y);
	}

	cout << ans.size() << endl;
	REP(i, ans.size()){
		cout << ans[i].FI << " " << ans[i].SE << endl;
	}

	return 0;
}


Measured memory_bytes: 5484