#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <string>
#include <math.h>
#include <iomanip>
#include <limits>
#include <list>
#include <queue>
#include <tuple>
#include <map>
using namespace std;
#define MOD (long long int)(1e9+7)
#define ll long long int
#define rep(i,n) for(int i=0; i<(int)(n); i++)
#define reps(i,n) for(int i=1; i<=(int)(n); i++)
#define REP(i,n) for(int i=n-1; i>=0; i--)
#define REPS(i,n) for(int i=n; i>0; i--)
#define INF (int)(1123456789)
#define LINF (long long int)(112345678901234567)
#define chmax(a, b) a = (((a)<(b)) ? (b) : (a))
#define chmin(a, b) a = (((a)>(b)) ? (b) : (a))
#define all(v) v.begin(), v.end()

ll mpow(ll a, ll b){
	if(b==0){
		return 1;
	}else if(b%2==0){
		ll memo = mpow(a,b/2);
		return memo*memo%MOD;
	}else{
		return mpow(a,b-1) * a % MOD;
	}
}

ll gcd(ll a, ll b){
	if(b==0){
		return a;
	}else{
		return gcd(b, a%b);
	}
}

int main(void){
	ll k,x,y;
	cin>>k;
	cin>>x>>y;
	ll nx = 0, ny = 0;
	vector<pair<ll, ll>> ans;
	ll dist = abs(nx-x) + abs(ny-y);
	ll amari = dist%k;
	if(k%2 == 0 && amari%2 == 1){
		cout<<-1<<endl;
		return 0;
	}
	/*if(k%2 == 1 && amari%2 == 0){
		if(nx < x){
			nx += k;
		}else{
			nx -= k;
		}
		ans.push_back(pair<ll,ll>{nx,ny});
		dist = abs(nx-x) + abs(ny-y);
		amari = dist%k;
	}
	cout<<dist<<" "<<amari<<endl;
	ll hanasu = (k - amari) / 2;
	ll tikaduku = k - hanasu;*/
	if((dist < k) && dist%2!=0){
		if(nx < x){
			nx += k - abs(ny);
		}else{
			nx -= k - abs(ny);
		}
		ny = 0;
		ans.push_back(pair<ll,ll>{nx,ny});
	}

	dist = abs(nx-x) + abs(ny-y);
	amari = dist%k;
	//cout<<ny<<endl;

	ll hanasu, tikaduku;
	if(dist < k){//遠ざける

			hanasu = k-dist + dist/2;
			tikaduku = dist/2;
			if(abs(nx-x) > abs(ny-y)){
				if(nx < x){
					nx += tikaduku;
				}else{
					nx -= tikaduku;
				}
				if(ny < y){
					ny -= hanasu;
				}else{
					ny += hanasu;
				}
			}else{
				if(ny < y){
					ny += tikaduku;
				}else{
					ny -= tikaduku;
				}
				if(nx < x){
					nx -= hanasu;
				}else{
					nx += hanasu;
				}
			}
		/*else{
			if(nx < x){
				nx += k - abs(ny);
			}else{
				nx -= k - abs(ny);
			}
			ny = 0;
		}*/
		ans.push_back(pair<ll,ll>{nx,ny});
	}else if(amari != 0){//近づけつつ調整
		if((amari+k)%2 != 0){
			if(abs(nx-x) > abs(ny-y)){
				if(nx<x){
					nx += k/2 + 1;
				}else{
					nx -= k/2 + 1;
				}
				if(ny < y){
					ny -= k/2;
				}else{
					ny += k/2;
				}
			}else{
				if(ny < y){
					ny += k/2 + 1;
				}else{
					ny -= k/2 + 1;
				}
				if(nx < x){
					nx -= k/2;
				}else{
					nx += k/2;
				}
			}
			ans.push_back(pair<ll,ll>{nx,ny});
		}
		dist = abs(nx-x) + abs(ny-y);
		amari = dist%k;
		ll tikaduku = amari + (k-amari)/2;
		ll hanasu = (k-amari)/2;
		if(abs(nx - x) >= tikaduku){
			if(nx < x){
				nx += tikaduku;
			}else{
				nx -= tikaduku;
			}
			if(ny < y){
				ny -= hanasu;
			}else{
				ny += hanasu;
			}
		}else{
			if(ny < y){
				ny += tikaduku - abs(nx-x);
			}else{
				ny -= tikaduku - abs(nx-x);
			}
			if(nx < x){
				nx = x + hanasu;
			}else{
				nx = x - hanasu;
			}
		}
		ans.push_back(pair<ll, ll>{nx,ny});
	}

	
	//cout<<"hoge"<<nx<<endl;

	while(abs(nx - x) >= k){
		if(nx < x){
			nx += k;
			ans.push_back(pair<ll,ll>{nx,ny});
		}else{
			nx -= k;
			ans.push_back(pair<ll,ll>{nx,ny});
		}
		//cout<<nx<<" "<<x<<endl;
	}
	if(abs(nx-x) > 0){

		if(ny < y){
			ny += k - abs(nx-x);
		}else{
			ny -= k - abs(nx-x);
		}
		//cout<<"aa"<<endl;
		nx = x;
		ans.push_back(pair<ll, ll>{nx, ny});
	}
	while(abs(ny - y) >= k){
		if(ny < y){
			ny += k;
		}else{
			ny -= k;
		}
		ans.push_back(pair<ll,ll>{nx,ny});
	}

	cout<<ans.size()<<endl;
	rep(i,ans.size()){
		cout<<ans[i].first<<" "<<ans[i].second<<endl;
	}
	return 0;
}


Measured memory_bytes: 5484