#include <float.h>
#include <limits.h>
#include <math.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>

// 内部変数
static FILE *szpFpI;											// 入力
static int siFLen;												// 飛距離
static int siGx, siGy;											// 目的位置
static int siGLen;												// 目的位置までの距離
static int siNx, siNy;											// 現在位置

// 内部変数 - テスト用
#ifdef D_TEST
	static int siRes;
	static FILE *szpFpA;
	static int siTNo;
#endif

// 出力
int
fOut(
	char *pcpLine				// <I> １行
)
{
	char lc1Buf[1024];

#ifdef D_TEST
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, pcpLine)) {
		siRes = -1;
	}
#else
	printf("%s", pcpLine);
#endif

	return 0;
}

// １打
int
fHit(
	int piFLen					// <I> 直進距離
	, int piLLen				// <I> 迂回距離
)
{
	char lc1Buf[1024];

	// X方向
	int liXWay;
	if (siGx > siNx) {
		liXWay = 1;
	}
	else if (siGx < siNx) {
		liXWay = -1;
	}
	else {
		liXWay = 0;
	}
	int liXLen = abs(siGx - siNx);
	if (liXLen > piFLen) {
		liXLen = piFLen;
	}
	siNx += liXLen * liXWay;		// 移動
	piFLen -= liXLen;				// 残飛距離

	// Y方向
	int liYWay;
	if (siGy >= siNy) {
		liYWay = 1;
	}
	else {
		liYWay = -1;
	}
	siNy += piFLen * liYWay;		// 移動

	// 迂回距離
	if (siGx == siNx) {
		if (liXLen == 0) {
			siNx += piLLen;
		}
		else {
			siNx += piLLen * liXWay;
		}
	}
	else {
		siNy += piLLen * -liYWay;
	}

	// 出力 - 位置
	sprintf(lc1Buf, "%d %d\n", siNx, siNy);
	fOut(lc1Buf);

	return 0;
}

// 合計打数 - 取得
int
fGetSum(
	int piCnt					// <I> 直進打数
)
{
	// 残距離
	int liLen = abs(siGLen - siFLen * piCnt);
	if (liLen % 2 != 0) {
		return -1;
	}
	if (liLen == 0) {
		return piCnt;
	}
	else {
		return piCnt + 2;
	}
}

// 実行メイン
int
fMain(
)
{
	int i;
	char lc1Buf[1024];

	// 飛距離 - 取得
	fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
	sscanf(lc1Buf, "%d", &siFLen);

	// 目的位置 - 取得
	fgets(lc1Buf, sizeof(lc1Buf), szpFpI);
	sscanf(lc1Buf, "%d%d", &siGx, &siGy);

	// 目的位置までの距離
	siGLen = abs(siGx) + abs(siGy);

	// 直進打数
	int liCnt1 = siGLen / siFLen;
	int liCnt2;
	if (liCnt1 > 0) {
		liCnt2 = liCnt1 - 1;
	}
	else {
		liCnt2 = 1;
	}

	// 合計打数 - 取得
	int liSumCnt1 = fGetSum(liCnt1);
	int liSumCnt2 = fGetSum(liCnt2);

	// 直進打数・合計打数 - 更新
	if (liSumCnt2 >= 0) {
		if (liSumCnt1 < 0 || liSumCnt1 > liSumCnt2) {
			liCnt1 = liCnt2;
			liSumCnt1 = liSumCnt2;
		}
	}
	if (liSumCnt1 < 0) {
		sprintf(lc1Buf, "-1\n");
		fOut(lc1Buf);
		return 0;
	}

	// 出力 - 合計打数
	sprintf(lc1Buf, "%d\n", liSumCnt1);
	fOut(lc1Buf);

	// 直進打数
	for (i = 0; i < liCnt1; i++) {
		fHit(siFLen, 0);
	}

	// 迂回
	if (liSumCnt1 > liCnt1) {
		int liLen = abs(siGLen - siFLen * liCnt1);
		liLen = (siFLen * 2 - liLen) / 2;
		fHit(siFLen - liLen, liLen);
		fHit(siFLen, 0);
	}

	return 0;
}

// １回実行
int
fOne(
)
{
	int liRet;
	char lc1Buf[1024];

	// データ - 初期化
	siNx = siNy = 0;											// 現在位置

	// 入力 - セット
#ifdef D_TEST
	sprintf(lc1Buf, ".\\Test\\T%d.txt", siTNo);
	szpFpI = fopen(lc1Buf, "r");
	sprintf(lc1Buf, ".\\Test\\A%d.txt", siTNo);
	szpFpA = fopen(lc1Buf, "r");
	siRes = 0;
#else
	szpFpI = stdin;
#endif

	// 実行メイン
	liRet = fMain();

	// 残データ有無
#ifdef D_TEST
	lc1Buf[0] = '\0';
	fgets(lc1Buf, sizeof(lc1Buf), szpFpA);
	if (strcmp(lc1Buf, "")) {
		siRes = -1;
	}
#endif

	// テストファイルクローズ
#ifdef D_TEST
	fclose(szpFpI);
	fclose(szpFpA);
#endif

	// テスト結果
#ifdef D_TEST
	if (siRes == 0) {
		printf("OK %d\n", siTNo);
	}
	else {
		printf("NG %d\n", siTNo);
	}
#endif

	return 0;
}

// プログラム開始
int
main()
{

#ifdef D_TEST
	int i;
	for (i = D_TEST_SNO; i <= D_TEST_ENO; i++) {
		siTNo = i;
		fOne();
	}
#else
	fOne();
#endif

	return 0;
}



Measured memory_bytes: 2176