#include <bits/stdc++.h>
using namespace std;
const int oo = 0x3f3f3f3f;
const int MAXN = 510;
int n;
char c[MAXN][MAXN];
vector<pair<int, int> > v;
pair<int, int> ish;
int ccw(pair<int, int> a, pair<int, int> b, pair<int, int> c) {
  return a.first * (b.second - c.second) + b.first * (c.second - a.second) +
         c.first * (a.second - b.second);
}
int dist(pair<int, int> a, pair<int, int> b) {
  return (a.first - b.first) * (a.first - b.first) +
         (a.second - b.second) * (a.second - b.second);
}
bool cmp(pair<int, int> a, pair<int, int> b) { return ccw(v[0], a, b) < 0; }
int main() {
  scanf("%d", &n);
  while (n) {
    v.clear();
    for (int i = 0; i < n; i++) {
      scanf("%s", c[i]);
      for (int t = 0; t < n; t++) {
        c[i][t] -= '0';
      }
    }
    for (int i = 1; i < n; i++) {
      for (int t = 1; t < n; t++) {
        if (c[i - 1][t - 1] && c[i][t - 1] && c[i - 1][t] && c[i][t]) {
          v.push_back({i, t});
          c[i][t]--;
          c[i - 1][t]--;
          c[i][t - 1]--;
          c[i - 1][t - 1]--;
        }
      }
    }
    for (int i = 0; i < n; i++) {
      if (c[0][i]) {
        v.push_back({0, i});
        c[0][i]--;
        if (i + 1 < n) c[0][i + 1]--;
      }
      if (c[n - 1][i]) {
        v.push_back({n - 1, i});
        c[n - 1][i]--;
        if (i + 1 < n) c[n - 1][i + 1]--;
      }
      if (c[i][0]) {
        v.push_back({i, 0});
        c[i][0]--;
        if (i + 1 < n) c[i + 1][0]--;
      }
      if (c[i][n - 1]) {
        v.push_back({i, n - 1});
        c[i][n - 1]--;
        if (i + 1 < n) c[i + 1][n - 1]--;
      }
    }
    vector<pair<int, int> > cp;
    for (auto x : v) cp.push_back(x);
    v.clear();
    for (auto x : cp) v.push_back({x.second, n - x.first});
    sort(v.begin(), v.end());
    v.erase(unique(v.begin(), v.end()), v.end());
    pair<int, int> h[v.size() * 2];
    int k = 0;
    for (pair<int, int> x : v) {
      while (k >= 2 && ccw(h[k - 2], h[k - 1], x) >= 0) k--;
      h[k++] = x;
    }
    int t = k + 1;
    for (int i = v.size() - 2; i >= 0; i--) {
      while (k >= t && ccw(h[k - 2], h[k - 1], v[i]) >= 0) k--;
      h[k++] = v[i];
    }
    printf("%d\n", k - 1);
    for (int i = 0; i < k - 1; i++) printf("%d %d\n", h[i].first, h[i].second);
    scanf("%d", &n);
  }
  return 0;
}
