unittest
{
	assert( [ "5", "0 5" ].parse.expand.solve == "1\n0 5" );				// 追加ケース
	assert( [ "5", "5 -5" ].parse.expand.solve == "2\n0 -5\n5 -5" );		// 追加ケース
	assert( [ "5", "-5 5" ].parse.expand.solve == "2\n0 5\n-5 5" );			// 追加ケース
	assert( [ "5", "1 4" ].parse.expand.solve == "1\n1 4" );				// 追加ケース
	assert( [ "5", "-8 2" ].parse.expand.solve == "2\n-5 0\n-8 2" );		// 追加ケース
	
//	assert( [ "11", "-1 2" ].parse.expand.solve == "3\n7 4\n2 10\n-1 2" );
	assert( [ "11", "-1 2" ].parse.expand.solve == "3\n11 0\n6 6\n-1 2" );
	assert( [ "4600", "52 149" ].parse.expand.solve == "-1" );
//	assert( [ "4", "9 9" ].parse.expand.solve == "5\n1 3\n4 2\n4 6\n6 8\n9 9" );
	assert( [ "4", "9 9" ].parse.expand.solve == "5\n-1 3\n-1 7\n1 9\n5 9\n9 9" );
}



import std.algorithm;
import std.conv;
import std.format;
import std.range;
import std.stdio;
import std.typecons;

void main()
{
	stdin.byLineCopy.parse.expand.solve.writeln;
}

auto parse( Range )( Range input )
if( isInputRange!Range && is( ElementType!Range == string ) )
{
	auto k = input.front.to!( long );
	input.popFront;
	auto xy = input.front.split.to!( long[] );
	return tuple( k, xy[ 0 ], xy[ 1 ] );
}

auto solve( long k, long x, long y )
{
	// 計算しやすいように符号を+に統一
	auto sx = ( x < 0 ) ? -1L : 1L;
	auto sy = ( y < 0 ) ? -1L : 1L;
	x *= sx;
	y *= sy;
	auto w = ( y < x );
	if( w ) swap( x, y );
	
	// ゴールまでの距離を計算
	auto t = x + y;
	
	// どうやっても距離1までしか縮められないので無理
	if( k % 2 == 0 && t % 2 == 1 ) return "-1";
	
	// 最小打数と合計飛距離を計算
	auto n = ( t + k - 1 ) / k;
	if( n == 1 && t < k ) n++;				// 1打の飛距離よりゴールが近かったら必ず2打以上必要
	if( ( k * n ) % 2 != t % 2 ) n++;		// 飛距離とゴールまでの距離の偶奇を揃えるために追加で1打必要
	auto tt = k * n;
	
	// 各方向への飛距離を計算
	auto l = 0L;
	auto d = 0L;
	auto r = 0L;
	auto u = 0L;
	if( tt == t )
	{
		// 遠回りする必要がない場合は 下→右 コース
		l = 0L;
		d = y;
		r = x;
		u = 0L;
	}
	else
	{
		// 遠回りする必要がある場合は 左→下→右 コース
		l = ( tt - t ) / 2;
		d = y;
		r = tt - l - d;	
		u = 0L;
		
		// 折り返し地点をショートカットしてしまう打ち方になる場合は 左→下→右→上 コースで再計算
		auto e = ( l % k );
		if( e + d < k )
		{
			l -= e;
			d += e;
			r -= e;
			u += e;
		}
	}
	
	// 各打の座標を計算
	auto anss = new long[ 2 ][ n ];
	auto px = 0L;
	auto py = 0L;
	foreach( ref ans; anss )
	{
		auto ft = 0L;
		if( 0 < l )
		{
			// 左
			auto f = min( l, k - ft );
			px -= f;
			l -= f;
			ft += f;
		}
		if( l == 0 && 0 < d )
		{
			// 下
			auto f = min( d, k - ft );
			py += f;
			d -= f;
			ft += f;
		}
		if( l == 0 && d == 0 && 0 < r )
		{
			// 右
			auto f = min( r, k - ft );
			px += f;
			r -= f;
			ft += f;
		}
		if( l == 0 && d == 0 && r == 0 && 0 < u )
		{
			// 上
			auto f = min( u, k - ft );
			py -= f;
			u -= f;
			ft += f;
		}
		
		if( w ) ans = [ py * sx, px * sy ];
		else    ans = [ px * sx, py * sy ];
	}
	return format( "%s\n%s", anss.length, anss.map!( ( a ) => format( "%s %s", a[ 0 ], a[ 1 ] ) ).join( "\n" ) );
}
