#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
#include <queue>
#include <utility>
#include <cassert>

using namespace std;
typedef long long ll;
const int LEN = 100000;

struct fastio{
  int it,len;
  char s[LEN + 5];
  fastio(){
    it = len = 0;
  }
  char get(){
    if(it < len) return s[it++];
    it = 0, len = fread(s,1,LEN,stdin);
    return len ? s[it++] : EOF;
  }
  bool notend(){
    char c;
    for(c = get();c == ' ' || c == '\n';c = get());
    if(it) it--;
    return c != EOF;
  }
  void put(char c){
    if(it == LEN) fwrite(s,1,LEN,stdout), it = 0;
    s[it++] = c;
  }
  void flush(){
    fwrite(s,1,it,stdout);
  }
}buff,bufo;
inline int getint(){
  char c; int res = 0, sig = 1;
  for(c = buff.get();c < '0' || c > '9';c = buff.get()) if(c == '-') sig = -1;
  for(;c >= '0' && c <= '9';c = buff.get()) res = res * 10 + (c - '0');
  return sig * res;
}
inline ll getll(){
  char c; ll res = 0, sig = 1;
  for(c = buff.get();c < '0' || c > '9';c = buff.get()) if(c == '-') sig = -1;
  for(;c >= '0' && c <= '9';c = buff.get()) res = res * 10 + (c - '0');
  return sig * res;
}
inline void putint(int x){
  if(!x) bufo.put('0');
  else{
    if(x < 0) bufo.put('-'), x = -x;
    int k = 0; char s[15];
    while(x){
      s[++k] = x % 10 + '0';
      x /= 10;
    }
    for(;k;k--) bufo.put(s[k]);
  }
}
inline void putll(ll x){
  if(!x) bufo.put('0');
  else{
    if(x < 0) bufo.put('-'), x = -x;
    int k = 0; char s[25];
    while(x){
      s[++k] = x % 10 + '0';
      x /= 10;
    }
    for(;k;k--) bufo.put(s[k]);
  }
}
inline char get_char(){
  char c;
  for(c = buff.get();c == ' ' || c == '\n';c = buff.get());
  return c;
}
int k,x,y,sigx,sigy,cx,cy;
int main(){
  k = getint(), x = getint(), y = getint(), sigx = sigy = 1;
  if(x < 0) sigx = -1, x = -x;
  if(y < 0) sigy = -1, y = -y;
  if(k % 2 == 0 && (x + y) % 2){
    puts("-1");
    return 0;
  }
  int rst;
  if((x + y) % k == 0){
    rst = 0;
  }else{
    rst = ((x + y) / k + 1) * k - (x + y);
    if(x + y + rst == k) rst += k;
    if(rst & 1) rst += k;
    
//    cout << rst << endl;
//    system("pause");
    
    rst >>= 1;
  }
  printf("%d\n",(x + y + rst * 2) / k);
  if(rst == 0){
    while(x >= k){
      cx += sigx * k;
      printf("%d %d\n",cx,cy);
      x -= k;
    }
    if(x == 0 && y == 0) return 0;
    cx += sigx * x;
    cy += sigy * (k - x);
    printf("%d %d\n",cx,cy);
    y -= k - x;
    x = 0;
    while(y >= k){
      cy += sigy * k;
      printf("%d %d\n",cx,cy);
      y -= k;
    }
    return 0;
  }
  if(rst > k){
    int rrst = rst - k;
    cy = sigy * -k;
    y += k;
    printf("%d %d\n",cx,cy);
    cx = sigx * (x + rrst);
    cy += sigy * (k - x - rrst);
    y -= k - x - rrst;
    x = -rrst;
    printf("%d %d\n",cx,cy);
    printf("%d %d\n",cx + sigx * x,cy + sigy * y);
    return 0;
  }
  if(x >= y){
    cx = sigx * (k - rst);
    x -= k - rst;
    cy = sigy * -rst;
    y += rst;
    printf("%d %d\n",cx,cy);
    while(x >= k){
      cx += sigx * k;
      printf("%d %d\n",cx,cy);
      x -= k;
    }
    cx += sigx * x;
    cy += sigy * (k - x);
    printf("%d %d\n",cx,cy);
    y -= k - x;
    while(y >= k){
      cy += sigy * k;
      printf("%d %d\n",cx,cy);
      y -= k;
    }
    return 0;
  }
  cx = sigx * -rst;
  x += rst;
  cy = sigy * (k - rst);
  y -= k - rst;
  printf("%d %d\n",cx,cy);
  while(y >= k){
    cy += sigy * k;
    printf("%d %d\n",cx,cy);
    y -= k;
  }
  cy += sigy * y;
  cx += sigx * (k - y);
  printf("%d %d\n",cx,cy);
  x -= k - y;
  y = 0;
  while(x >= k){
    cx += sigx * k;
    printf("%d %d\n",cx,cy);
    x -= k;
  }
  return 0;
}

Measured memory_bytes: 2304