#include <algorithm>
#include <bitset>
#include <cassert>
#include <cctype>
#include <chrono>
#define _USE_MATH_DEFINES
#include <cmath>
#include <cstdio>
#include <cstring>
#include <ctime>
#include <deque>
#include <functional>
#include <iostream>
#include <iterator>
#include <map>
#include <queue>
#include <random>
#include <set>
#include <sstream>
#include <string>
#include <tuple>
#include <utility>
#include <vector>
using namespace std;

#define FOR(i,m,n) for(int i=(m);i<(n);++i)
#define REP(i,n) FOR(i,0,n)
#define ALL(v) (v).begin(),(v).end()

const int INF = 0x3f3f3f3f;
const long long LINF = 0x3f3f3f3f3f3f3f3fLL;
const double EPS = 1e-8;
const int MOD = 1000000007; // 998244353;
const int dy[] = {1, 0, -1, 0}, dx[] = {0, -1, 0, 1};
/*-------------------------------------------------*/
int k;
vector<pair<int, int> > solve(int X, int Y) {
  if (k == X + Y) return vector<pair<int, int> >{make_pair(X, Y)};
  long long n = (X + Y + k - 1) / k;
  if (n == 1) ++n;
  if ((n * k - (X + Y)) % 2 == 1) {
    if (k % 2 == 0) {
      cout << -1 << '\n';
      exit(0);
    } else {
      ++n;
    }
  }
  vector<pair<int, int> > res;
  int x = 0, y = 0;
  if ((X + Y + k - 1) / k == 1 && n == 3) {
    int ab = (n * k - (X + Y)) / 2;
    int a = ab / 2, b = (ab + 1) / 2;
    x = k - b;
    y = -b;
    res.emplace_back(x, y);
    y += k - (X + a - x);
    x = X + a;
    res.emplace_back(x, y);
    x -= k - (Y - y);
    y = Y;
    res.emplace_back(x, y);
  } else {
    int a = (n * k - (X + Y)) / 2;
    while (x + k <= X + a) {
      x += k;
      res.emplace_back(x, y);
    }
    if (x < X + a) {
      y = k - (X + a - x);
      x = X + a;
      res.emplace_back(x, y);
    }
    while (y + k <= Y) {
      y += k;
      res.emplace_back(x, y);
    }
    if (y < Y) {
      x -= k - (Y - y);
      y = Y;
      res.emplace_back(x, y);
    }
    while (X < x) {
      x -= k;
      res.emplace_back(x, y);
    }
  }
  return res;
}

int main() {
  cin.tie(0); ios::sync_with_stdio(false);
  // freopen("input.txt", "r", stdin);

  int x, y; cin >> k >> x >> y;
  if (x < 0 && y < 0) {
    x *= -1; y *= -1;
    if (x > y) {
      auto ans = solve(y, x);
      int n = ans.size();
      cout << n << '\n';
      REP(i, n) cout << -ans[i].second << ' ' << -ans[i].first << '\n';
    } else {
      auto ans = solve(x, y);
      int n = ans.size();
      cout << n << '\n';
      REP(i, n) cout << -ans[i].first << ' ' << -ans[i].second << '\n';
    }
  } else if (x < 0 && y >= 0) {
    x *= -1;
    if (x > y) {
      auto ans = solve(y, x);
      int n = ans.size();
      cout << n << '\n';
      REP(i, n) cout << -ans[i].second << ' ' << ans[i].first << '\n';
    } else {
      auto ans = solve(x, y);
      int n = ans.size();
      cout << n << '\n';
      REP(i, n) cout << -ans[i].first << ' ' << ans[i].second << '\n';
    }
  } else if (x >= 0 && y < 0) {
    y *= -1;
    if (x > y) {
      auto ans = solve(y, x);
      int n = ans.size();
      cout << n << '\n';
      REP(i, n) cout << ans[i].second << ' ' << -ans[i].first << '\n';
    } else {
      auto ans = solve(x, y);
      int n = ans.size();
      cout << n << '\n';
      REP(i, n) cout << ans[i].first << ' ' << -ans[i].second << '\n';
    }
  } else {
    if (x > y) {
      auto ans = solve(y, x);
      int n = ans.size();
      cout << n << '\n';
      REP(i, n) cout << ans[i].second << ' ' << ans[i].first << '\n';
    } else {
      auto ans = solve(x, y);
      int n = ans.size();
      cout << n << '\n';
      REP(i, n) cout << ans[i].first << ' ' << ans[i].second << '\n';
    }
  }
  return 0;
}


Measured memory_bytes: 3952