using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.Text;
using CompLib.Util;

public class Program
{
    private long K;
    private long X, Y;

    public void Solve()
    {
        var sc = new Scanner();
        K = sc.NextInt();
        X = sc.NextInt();
        Y = sc.NextInt();

        // Kが偶数 パリティが変わらない
        if (K % 2 == 0 && (X + Y) % 2 != 0)
        {
            Console.WriteLine("-1");
            return;
        }

        bool signX = X >= 0;
        bool signY = Y >= 0;
        long tX = Math.Abs(X);
        long tY = Math.Abs(Y);

        List<(long dx, long dy)> ls = new List<(long dx, long dy)>();

        if (K % 2 == 1 && (tX + tY) % 2 == 1 && (tX + tY) < K)
        {
            // 3回
            long d = (3 * K - (tX + tY)) / 2;
            // 1. 下にK
            // 2. 右にx+(d-K) 上に 2K-(x+d)
            // 3. 上に2K-d 左に d-K
            ls.Add((0, -K));
            ls.Add((tX + (d - K), 2 * K - (tX + d)));
            ls.Add((K - d, 2 * K - d));
        }
        else
        {
            if ((tX + tY) % K != 0)
            {
                long s = (tX + tY) / K + 1;
                // 
                if ((s * K - (tX + tY)) % 2 != 0)
                {
                    Debug.Assert(K % 2 != 0);
                    s++;
                }

                if (s == 1)
                {
                    Debug.Assert(K % 2 == 0);
                    s++;
                }

                long d = (s * K - (tX + tY)) / 2;
                // d遠回りする
                long a = long.MaxValue;
                long b = long.MaxValue;
                if (tX >= K - d)
                {
                    // 下にd移動、右にK-d移動

                    long tmpX = tX - (K - d);
                    long tmpY = tY + d;
                    a = tmpX / K + tmpY / K + (tmpX % K != 0 ? 1 : 0);
                }
                else
                {
                    Debug.Assert(tY >= K - d);
                    // 左にd移動 上にK-d移動

                    long tmpX = tX + d;
                    long tmpY = tY - (K - d);
                    b = tmpX / K + tmpY / K + (tmpX % K != 0 ? 1 : 0);
                }

                if (a < b)
                {
                    ls.Add((K - d, -d));
                    tX = tX - (K - d);
                    tY = tY + d;
                }
                else
                {
                    ls.Add((-d, K - d));
                    tX = tX + d;
                    tY = tY - (K - d);
                }
            }

            Debug.Assert((tX + tY) % K == 0);

            for (long i = 0; i < tX / K; i++)
            {
                ls.Add((K, 0));
            }

            for (long i = 0; i < tY / K; i++)
            {
                ls.Add((0, K));
            }

            if (tX % K != 0)
            {
                ls.Add((tX % K, tY % K));
            }
        }

        var sb = new StringBuilder();
        long px = 0;
        long py = 0;
        for (int i = 0; i < ls.Count; i++)
        {
            long dx = ls[i].dx;
            long dy = ls[i].dy;
            Debug.Assert(Math.Abs(dx) + Math.Abs(dy) == K);
            px += signX ? dx : -dx;
            py += signY ? dy : -dy;
            sb.AppendLine($"{px} {py}");
        }

        Debug.Assert(px == X);
        Debug.Assert(py == Y);
        Console.WriteLine(ls.Count);
        Console.Write(sb);
    }

    public static void Main(string[] args) => new Program().Solve();
}

namespace CompLib.Util
{
    using System;
    using System.Linq;

    class Scanner
    {
        private string[] _line;
        private int _index;
        private const char Separator = ' ';

        public Scanner()
        {
            _line = new string[0];
            _index = 0;
        }

        public string Next()
        {
            if (_index >= _line.Length)
            {
                string s;
                do
                {
                    s = Console.ReadLine();
                } while (s.Length == 0);

                _line = s.Split(Separator);
                _index = 0;
            }

            return _line[_index++];
        }

        public string ReadLine()
        {
            _index = _line.Length;
            return Console.ReadLine();
        }

        public int NextInt() => int.Parse(Next());
        public long NextLong() => long.Parse(Next());
        public double NextDouble() => double.Parse(Next());
        public decimal NextDecimal() => decimal.Parse(Next());
        public char NextChar() => Next()[0];
        public char[] NextCharArray() => Next().ToCharArray();

        public string[] Array()
        {
            string s = Console.ReadLine();
            _line = s.Length == 0 ? new string[0] : s.Split(Separator);
            _index = _line.Length;
            return _line;
        }

        public int[] IntArray() => Array().Select(int.Parse).ToArray();
        public long[] LongArray() => Array().Select(long.Parse).ToArray();
        public double[] DoubleArray() => Array().Select(double.Parse).ToArray();
        public decimal[] DecimalArray() => Array().Select(decimal.Parse).ToArray();
    }
}


Measured memory_bytes: 57604