#include <bits/stdc++.h>
#define rep(i,n) for(int i = 0; i < n; i++)
using namespace std;
typedef long long ll;
typedef pair<ll,ll> P;
vector<ll> ans1,ans2;
vector<P> ans;

ll direc(ll a)
{
	if (a >= 0) return ll(1);
	else return ll(-1);
}

int main()
{
	ll K,x,y;
	cin >> K >> x >> y;
	ll X = x+y, Y = x-y;
	bool flag = false;
	if (K % 2 == 0)
	{
		if (X % 2 != 0)
		{
			cout << "-1" << endl;
			return 0;
		}
		else
		{
			/*
			ll Xmax = abs(X) / K, Ymax = abs(Y) / K, Xmod = X % K, Ymod = Y % K;
			if (Xmax < Ymax)
			{
				swap(Xmax,Ymax);
				swap(Xmod,Ymod);
				swap(X,Y);
				flag = true;
			}		
			if (Xmod != 0) ans1.push_back(Xmod);
			rep(i,Xmax)
			{
				if (X > 0) ans1.push_back(K);
				else ans1.push_back(-1*K);
			}

			if (Y > 0) ans2.push_back(K);
			else ans2.push_back(-1*K);
			if (Ymod != 0) ans2.push_back(Ymod);
			rep(i,Ymax-1)
			{
				if (Y > 0) ans2.push_back(K);
				else ans2.push_back(-1*K);
			}
			int c = ans1.size() - ans2.size();
			rep(i,c)
			{
				ans2.push_back(0);
			}
			ll sum = accumulate(ans2.begin(), ans2.end(), 0LL);
			if (sum != Y)
			{
				ans1.push_back(0);
				if (Y > 0) ans2.push_back(-1*K);
				else ans2.push_back(K);
			}
			*/
			ll nowx = 0, nowy = 0;
			while(abs(nowx-x) + abs(nowy-y) > 2*K)
			{
				if (abs(nowx-x) >= abs(nowy-y))
				{
					ans.push_back(P(nowx + direc(x-nowx) * K,nowy));
					nowx += (x-nowx) / abs(x-nowx) * K;
				}
				else
				{
					ans.push_back(P(nowx,nowy + direc(y-nowy) * K));
					nowy += (y-nowy) / abs(y-nowy) * K;
				}
			}

			if (abs(nowx-x) + abs(nowy-y) == 2*K)
			{
				ll temp = min(K,abs(x-nowx));
				if (temp < K)
				{
					ans.push_back(P(x,nowy + (K-temp) * direc(y-nowy)));
				}
				else
				{
					ans.push_back(P(nowx + K * direc(x-nowx),nowy));
				}
				ans.push_back(P(x,y));
			}
			else if (abs(nowx-x) + abs(nowy-y) == K)
			{
				ans.push_back(P(x,y));
			}
			else
			{
				if (abs(x-nowx) < abs(y-nowy))
				{
					swap(x,y);
					swap(nowx,nowy);
					flag = true;
				}
				ll waste = 2*K-abs(x-nowx)-abs(y-nowy);
				waste /= 2;
				if (flag) ans.push_back(P(nowy-waste*direc(y-nowy),nowx+(K-waste)*direc(x-nowx)));
				else ans.push_back(P(nowx+(K-waste)*direc(x-nowx),nowy-waste*direc(y-nowy)));
				if (flag) ans.push_back(P(y,x));
				else ans.push_back(P(x,y));
			}
		}
	}
	else
	{
		ll nowx = 0, nowy = 0;
		while(abs(nowx-x) + abs(nowy-y) > 2*K)
		{
			if (abs(nowx-x) >= abs(nowy-y))
			{
				ans.push_back(P(nowx + direc(x-nowx) * K,nowy));
				nowx += (x-nowx) / abs(x-nowx) * K;
			}
			else
			{
				ans.push_back(P(nowx,nowy + direc(y-nowy) * K));
				nowy += (y-nowy) / abs(y-nowy) * K;
			}
		}

		if (abs(nowx-x) + abs(nowy-y) == 2*K)
		{
			//cout << "a";
			ll temp = min(K,abs(x-nowx));
			//cout << temp << endl;
			if (temp < K)
			{
				//cout << "b";
				ans.push_back(P(x,nowy + (K-temp) * direc(y-nowy)));
			}
			else
			{
				//cout << "c";
				ans.push_back(P(nowx + K * direc(x-nowx),nowy));
			}
			ans.push_back(P(x,y));
		}
		else if (abs(nowx-x) + abs(nowy-y) == K)
		{
			ans.push_back(P(x,y));
		}
		else
		{
			if (abs(x-nowx) < abs(y-nowy))
			{
				swap(x,y);
				swap(nowx,nowy);
				flag = true;
			}
			ll waste = 2*K-abs(x-nowx)-abs(y-nowy);
			//cout << waste << endl;
			if (waste % 2 == 0)
			{
				waste /= 2;
				if (flag) ans.push_back(P(nowy-waste*direc(y-nowy),nowx+(K-waste)*direc(x-nowx)));
				else ans.push_back(P(nowx+(K-waste)*direc(x-nowx),nowy-waste*direc(y-nowy)));
				if (flag) ans.push_back(P(y,x));
				else ans.push_back(P(x,y));
			}
			else
			{
				waste = (waste+K) / 2;
				if (waste >= K)
				{
					//cout << "a" << waste << endl;
					if (flag) ans.push_back(P(nowy-K*direc(y-nowy),nowx));
					else ans.push_back(P(nowx,nowy-K*direc(y-nowy)));
					nowy -= K*direc(y-nowy);
					waste -= K;
					if (flag) ans.push_back(P(nowy+(K-waste)*direc(y-nowy),nowx-waste*direc(x-nowx)));
					else ans.push_back(P(nowx-waste*direc(x-nowx),nowy+(K-waste)*direc(y-nowy)));
					if (flag) ans.push_back(P(y,x));
					else ans.push_back(P(x,y));
				}
				else
				{
					if (flag) ans.push_back(P(nowy-waste*direc(y-nowy),nowx+(K-waste)*direc(x-nowx)));
					else ans.push_back(P(nowx+(K-waste)*direc(x-nowx),nowy-waste*direc(y-nowy)));
					nowx += (K-waste)*direc(x-nowx);
					nowy -= waste*direc(y-nowy);

					ll temp = min(K,abs(x-nowx));
					if (temp < K)
					{
						if (flag) ans.push_back(P(nowy + (K-temp) * direc(y-nowy),x));
						else ans.push_back(P(x,nowy + (K-temp) * direc(y-nowy)));
					}
					else
					{
						if (flag) ans.push_back(P(nowy,nowx + K * direc(x-nowx)));
						else ans.push_back(P(nowx + K * direc(x-nowx),nowy));
					}
					if (flag) ans.push_back(P(y,x));
					else ans.push_back(P(x,y));
				}
			}
		}
	}

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

Measured memory_bytes: 7244