#include <bits/stdc++.h>
using namespace std;
struct Po {
  int x, y;
} p[510 * 510], q[510 * 510];
char st[510];
int a[510][510], b[510], A, B;
bool mark[510][510];
int lx[9] = {0, -1, -1, -1, 0, 1, 1, 1, 0};
int ly[9] = {0, -1, 0, 1, 1, 1, 0, -1, -1};
int LX[4] = {-1, -1, 0, 0};
int LY[4] = {-1, 0, 0, -1};
Po operator-(Po a, Po b) { return (Po){a.x - b.x, a.y - b.y}; }
bool cmp(Po a, Po b) { return a.x == b.x ? a.y < b.y : a.x < b.x; }
int cross(Po a, Po b) { return a.x * b.y - a.y * b.x; }
void tubao(int m) {
  sort(p + 1, p + m + 1, cmp);
  int top = 0;
  for (int i = 1; i <= m; i++) {
    while (top > 1 && cross(p[i] - q[top - 1], q[top] - q[top - 1]) <= 0) top--;
    q[++top] = p[i];
  }
  int k = top;
  for (int i = m - 1; i; i--) {
    while (top > k && cross(p[i] - q[top - 1], q[top] - q[top - 1]) <= 0) top--;
    q[++top] = p[i];
  }
  printf("%d\n", top - 1);
  for (int i = 1; i < top; i++) printf("%d %d\n", q[i].x, q[i].y);
}
void push(int x) { mark[A + LX[x]][B + LY[x]] = 1; }
void push(int x, int y) {
  push(x);
  push(y);
}
void push(int x, int y, int z) {
  push(x);
  push(y);
  push(z);
}
int main() {
  while (1) {
    int n;
    scanf("%d", &n);
    if (n == 0) break;
    for (int i = 1; i <= n; i++) {
      scanf("%s", st + 1);
      for (int j = 1; j <= n; j++) a[i][j] = st[j] - '0';
    }
    memset(mark, 0, sizeof(mark));
    for (int i = 2; i < n; i++)
      for (int j = 2; j < n; j++) {
        A = i;
        B = j;
        for (int k = 1; k <= 9; k++) b[k] = a[i + lx[k]][j + ly[k]];
        if (a[i][j] == 1) {
          if (b[6] + b[7] + b[8] == 0)
            push(1);
          else if (b[2] + b[3] + b[4] == 0)
            push(3);
          else if (b[4] + b[5] + b[6] == 0)
            push(0);
          else if (b[1] + b[2] + b[8] == 0)
            push(2);
        } else if (a[i][j] == 2) {
          if (b[6] == 0)
            push(0, 1);
          else if (b[8] == 0)
            push(1, 2);
          else if (b[2] == 0)
            push(2, 3);
          else if (b[4] == 0)
            push(0, 3);
          else if (b[3] + b[7] == 0)
            push(0, 2);
          else if (b[1] + b[5] == 0)
            push(1, 3);
        } else if (a[i][j] == 3) {
          if (b[7] == 0)
            push(0, 1, 2);
          else if (b[5] == 0)
            push(0, 1, 3);
          else if (b[3] == 0)
            push(0, 2, 3);
          else if (b[1] == 0)
            push(1, 2, 3);
        } else if (a[i][j] == 4) {
          push(0, 1);
          push(2, 3);
        }
      }
    int m = 0;
    for (int i = 0; i <= n; i++)
      for (int j = 0; j <= n; j++)
        if (mark[i][j]) p[++m] = (Po){j, n - i};
    tubao(m);
  }
  return 0;
}
