#include <bits/stdc++.h>
using namespace std;
#define rep(i,n) for (int i=0; i<(int)(n); i++)
using ll = long long;
using vi = vector<int>;
using vl = vector<ll>;
using Graph = vector<vector<int>>;  // int <=> ll
using P = pair<ll, ll>;  // int <=> ll
const int INFTY = 1e9+7;

int main() {
  ll K, X, Y;
  cin >> K >> X >> Y;
  ll dist = abs(X) + abs(Y);
  
  if (K%2 == 0 && dist%2 == 1) {
    cout << -1 << endl;
    return 0;
  }

  if (K == dist) {
    cout << 1 << endl;
    cout << X << " " << Y << endl;
    return 0;
  }

  if (K > dist) {
    if (dist%2 == 0) {
      const int s = 2;
      ll res = (K*s-dist)/2;
      ll x1, y1;

      if (abs(X) > abs(Y)) {
        x1 = X/abs(X) * (K-res);
        if (Y == 0) y1 = res;
        else y1 = -Y/abs(Y) * res;
      }
      else {
        if (X == 0) x1 = res;
        else x1 = -X/abs(X) * res;
        y1 = Y/abs(Y) * (K-res);
      }

      cout << s << endl;
      cout << x1 << " " << y1 << endl;
      cout << X << " " << Y << endl;
    }

    else {
      const int s = 3;
      ll res = (K*s-dist)/2;
      ll x1, y1, x2, y2;

      if (Y == 0) {
        x1 = -X/abs(X) * K;
        y1 = 0;
        x2 = -X/abs(X) * (res%K);
        y2 = res%K;
      }
      else {
        x1 = 0;
        y1 = -Y/abs(Y) * K;
        if (X == 0) x2 = res%K;
        else x2 = -X/abs(X) * (res%K);
        y2 = -Y/abs(Y) * (res%K);
      }

      cout << s << endl;
      cout << x1 << " " << y1 << endl;
      cout << x2 << " " << y2 << endl;
      cout << X << " " << Y << endl;
    }
    return 0;
  }

  int s = dist / K;
  ll dist_res = dist % K;
  if (dist_res != 0) {
    if ((K-dist_res)%2 == 0) s += 1;
    else s += 2;
  }

  ll res = (K*s-dist)/2;  // K > res
  ll x1, y1;
  vector<P> coord;
  if (X == 0) {  // Y != 0
    x1 = res;
    y1 = Y/abs(Y) * (K-res);
    P point = P(x1,y1);
    coord.push_back(point);
    rep(i,s-2) {
      point.second += Y/abs(Y) * K;
      coord.push_back(point);
    }
    coord.push_back(P(X,Y));
  }
  else if (Y == 0) {  // X != 0
    x1 = X/abs(X) * (K-res);
    y1 = res;
    P point = P(x1,y1);
    coord.push_back(point);
    rep(i,s-2) {
      point.first += X/abs(X) * K;
      coord.push_back(point);
    }
    coord.push_back(P(X,Y));
  }
  else {  // X != 0 && Y != 0
    if (abs(X) < abs(Y)) {
      x1 = -X/abs(X) * res;
      y1 = Y/abs(Y) * (K-res);
      P point = P(x1,y1);
      coord.push_back(point);
      rep(i,abs(Y-y1)/K) {
        point.second += Y/abs(Y) * K;
        coord.push_back(point);
      }
      point.first += X/abs(X) * (K-abs(Y-point.second));
      point.second = Y;
      coord.push_back(point);
      x1 = point.first;
      rep(i,abs(X-x1)/K) {
        point.first += X/abs(X) * K;
        coord.push_back(point);
      }
    }
    else {
      x1 = X/abs(X) * (K-res);
      y1 = -Y/abs(Y) * res;
      P point = P(x1,y1);
      coord.push_back(point);
      rep(i,abs(X-x1)/K) {
        point.first += X/abs(X) * K;
        coord.push_back(point);
      }
      point.second += Y/abs(Y) * (K-abs(X-point.first));
      point.first = X;
      coord.push_back(point);
      y1 = point.second;
      rep(i,abs(Y-y1)/K) {
        point.second += Y/abs(Y) * K;
        coord.push_back(point);
      }
    }
  }

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


Measured memory_bytes: 5744