#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void read(T &a) {
  a = 0;
  char c;
  bool f = 0;
  while (!isdigit(c = getchar()))
    if (c == '-') f = 1;
  do a = a * 10 + c - '0';
  while (isdigit(c = getchar()));
  if (f) a = -a;
}
const int INF = 0x7fffffff;
const long double eps = 1e-8;
const long long MOD = 1e9 + 7;
const int MAXN = 505;
struct Point {
  int x, y;
  Point(int _x = 0, int _y = 0) : x(_x), y(_y) {}
} A[MAXN * MAXN];
inline Point operator-(const Point &a, const Point &b) {
  return Point(a.x - b.x, a.y - b.y);
}
inline int cross(const Point &a, const Point &b) {
  return a.x * b.y - a.y * b.x;
}
inline int cross(const Point &a, const Point &b, const Point &O) {
  return cross(a - O, b - O);
}
inline int norm(const Point &a) { return a.x * a.x + a.y * a.y; }
bool cmp(const Point &a, const Point &b) {
  int v = cross(a - A[1], b - A[1]);
  if (v > 0) return 1;
  if (v < 0) return 0;
  return norm(a - A[1]) < norm(b - A[1]);
}
int graham(int N) {
  int id = 1, top = 1;
  for (int i = 2; i <= N; ++i)
    if (A[i].x < A[id].x || (A[i].x == A[id].x && A[i].y < A[id].y)) id = i;
  swap(A[1], A[id]);
  sort(A + 2, A + N + 1, cmp);
  A[N + 1] = A[1];
  for (int i = 2; i <= N + 1; ++i) {
    while (top >= 2 && cross(A[i] - A[top], A[top] - A[top - 1]) >= 0) --top;
    A[++top] = A[i];
  }
  return top;
}
bool mark[MAXN][MAXN];
int cnt[MAXN][MAXN];
int N;
int main() {
  while (1) {
    read(N);
    if (N == 0) return 0;
    for (int j = N; j >= 1; --j)
      for (int i = 1; i <= N; ++i) {
        char c;
        while (!isdigit(c = getchar()))
          ;
        cnt[i][j] = c - '0';
      }
    int s = 0;
    for (int i = 1; i <= N; ++i)
      for (int j = 1; j <= N; ++j)
        mark[i][j] =
            cnt[i][j] - mark[i - 1][j] - mark[i - 1][j - 1] - mark[i][j - 1];
    for (int i = 1; i <= N; ++i)
      for (int j = 1; j <= N; ++j)
        if (mark[i][j]) A[++s] = Point(i, j);
    s = graham(s);
    for (int i = 1; i <= s - 2; ++i)
      if (cross(A[i + 1], A[i + 2], A[i]) == 0) return -1;
    printf("%d\n", s - 1);
    for (int i = s; i >= 2; --i) printf("%d %d\n", A[i].x, A[i].y);
  }
  return 0;
}
