#include <bits/stdc++.h>
using namespace std;
long long gcd(long long a, long long b) { return b == 0 ? a : gcd(b, a % b); }
const int MAXN = 100000;
const int MAXQ = 200000;
const int MAXP = MAXQ;
const int DX[] = {0, +1, 0, -1}, DY[] = {+1, 0, -1, 0};
typedef struct P {
  int x, y;
  P() {}
  P(int x, int y) : x(x), y(y) {}
} P;
bool operator<(const P &a, const P &b) {
  if (a.x != b.x) return a.x < b.x;
  return a.y < b.y;
}
const P operator-(const P &a, const P &b) { return P(a.x - b.x, a.y - b.y); }
const int operator^(const P &a, const P &b) { return a.x * b.y - a.y * b.x; }
bool ok(const P &a, const P &b, const P &c) { return ((b - a) ^ (c - a)) < 0; }
int n;
P q[MAXQ];
int nq;
P p[MAXP];
int np;
P h[2 * MAXP];
int nh;
int mx[MAXN + 1], mn[MAXN + 1];
bool iszero(int x, int y) {
  if (y < 0 || y >= n || mn[y] > mx[y]) return true;
  return x < mn[y] || x > mx[y];
}
void solve() {
  for (int i = (0); i < (n); ++i) mx[i] = INT_MIN, mn[i] = INT_MAX;
  for (int i = (0); i < (nq); ++i) {
    int x = q[i].x, y = q[i].y;
    if (x < mn[y]) mn[y] = x;
    if (x > mx[y]) mx[y] = x;
  }
  np = 0;
  for (int i = (0); i < (nq); ++i) {
    for (int k = (0); k < (4); ++k) {
      int kk = (k + 1) % 4;
      if (iszero(q[i].x + DX[k], q[i].y + DY[k]) &&
          iszero(q[i].x + DX[kk], q[i].y + DY[kk]))
        p[np++] = P(q[i].x + k / 2, q[i].y + ((k == 1 || k == 2) ? 1 : 0));
    }
  }
  sort(p, p + np);
  nh = 0;
  for (int i = (0); i < (np); ++i) {
    while (nh >= 2 && !ok(h[nh - 2], h[nh - 1], p[i])) --nh;
    h[nh++] = p[i];
  }
  int th = nh;
  for (int i = np - 1; i >= 0; --i) {
    while (nh - th >= 1 && !ok(h[nh - 2], h[nh - 1], p[i])) --nh;
    h[nh++] = p[i];
  }
  --nh;
  printf("%d\n", nh);
  for (int i = (0); i < (nh); ++i) printf("%d %d\n", h[i].x, h[i].y);
}
void run() {
  while (scanf("%d%d", &n, &nq) == 2) {
    if (n == 0 && nq == 0) break;
    for (int i = (0); i < (nq); ++i)
      scanf("%d%d", &q[i].x, &q[i].y), --q[i].x, --q[i].y;
    solve();
  }
}
int main() {
  run();
  return 0;
}
