#include <bits/stdc++.h>
using namespace std;
const int MAXN = 500;
int n;
int p[MAXN + 5][MAXN + 5];
char c[MAXN + 5];
vector<pair<int, int> > v;
bool ok(int first, int second) {
  if (first < 0 || second < 0) return 0;
  if (p[first][second] == 0) return 0;
  return 1;
}
bool UL(int first, int second) {
  if (!ok(first - 1, second - 1)) return 0;
  if (!ok(first, second - 1)) return 0;
  if (!ok(first - 1, second)) return 0;
  return 1;
}
bool UR(int first, int second) {
  if (!ok(first - 1, second + 1)) return 0;
  if (!ok(first, second + 1)) return 0;
  if (!ok(first - 1, second)) return 0;
  return 1;
}
bool DL(int first, int second) {
  if (!ok(first + 1, second - 1)) return 0;
  if (!ok(first, second - 1)) return 0;
  if (!ok(first + 1, second)) return 0;
  return 1;
}
bool DR(int first, int second) {
  if (!ok(first + 1, second + 1)) return 0;
  if (!ok(first, second + 1)) return 0;
  if (!ok(first + 1, second)) return 0;
  return 1;
}
vector<pair<int, int> > UH;
vector<pair<int, int> > LH;
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);
}
bool cmp(pair<int, int> a, pair<int, int> b) {
  return a.second != b.second ? a.second < b.second : a.first < b.first;
}
bool solve() {
  scanf("%d", &n);
  if (!n) return 0;
  v.clear();
  UH.clear();
  LH.clear();
  for (int i = (0), _for = (n); i < _for; ++i) {
    scanf("%s", c);
    for (int j = (0), _for = (n); j < _for; ++j) p[i][j] = c[j] - '0';
  }
  for (int i = (0), _for = (n); i < _for; ++i)
    for (int j = (0), _for = (n); j < _for; ++j)
      if (p[i][j] == 1) {
        if (UL(i, j)) v.push_back(make_pair(i - 1, j - 1));
        if (UR(i, j)) v.push_back(make_pair(i - 1, j));
        if (DL(i, j)) v.push_back(make_pair(i, j - 1));
        if (DR(i, j)) v.push_back(make_pair(i, j));
      }
  for (int i = (0), _for = (v.size()); i < _for; ++i)
    swap(v[i].first, v[i].second);
  for (int i = (0), _for = (v.size()); i < _for; ++i)
    v[i].first++, v[i].second++;
  for (int i = (0), _for = (v.size()); i < _for; ++i)
    v[i].second = n - v[i].second;
  sort(v.begin(), v.end());
  LH.push_back(v[0]);
  for (int i = (1), _for = (v.size()); i < _for; ++i) {
    if (v[i] == LH[LH.size() - 1]) continue;
    while (LH.size() > 1 &&
           ccw(LH[LH.size() - 1], LH[LH.size() - 2], v[i]) >= 0)
      LH.pop_back();
    LH.push_back(v[i]);
  }
  UH.push_back(v[0]);
  for (int i = (1), _for = (v.size()); i < _for; ++i) {
    if (v[i] == UH[UH.size() - 1]) continue;
    while (UH.size() > 1 &&
           ccw(UH[UH.size() - 1], UH[UH.size() - 2], v[i]) <= 0)
      UH.pop_back();
    UH.push_back(v[i]);
  }
  printf("%d\n", (int)UH.size() + (int)LH.size() - 2);
  for (int i = (0), _for = (UH.size()); i < _for; ++i)
    printf("%d %d\n", UH[i].first, UH[i].second);
  for (int i = LH.size() - 2; i > 0; --i)
    printf("%d %d\n", LH[i].first, LH[i].second);
  return 1;
}
int main() {
  while (solve())
    ;
  return 0;
}
