#include <bits/stdc++.h>
using namespace std;
void _dbg(string) { cout << endl; }
template <class H, class... T>
void _dbg(string s, H h, T... t) {
  int l = s.find(',');
  cout << s.substr(0, l) << " = " << h << ", ";
  _dbg(s.substr(l + 1), t...);
}
template <class T, class U>
ostream& operator<<(ostream& o, const pair<T, U>& p) {
  o << "(" << p.first << "," << p.second << ")";
  return o;
}
template <class T>
ostream& operator<<(ostream& o, const vector<T>& v) {
  o << "[";
  for (T t : v) {
    o << t << ",";
  }
  o << "]";
  return o;
}
using Point = complex<double>;
const double EPS = 1e-8;
namespace std {
bool operator<(const Point a, const Point b) {
  return a.real() != b.real() ? a.real() < b.real() : a.imag() < b.imag();
}
}  // namespace std
double cross(Point a, Point b) {
  return a.real() * b.imag() - a.imag() * b.real();
}
vector<Point> GrahamScan(vector<Point> points) {
  int n = points.size();
  sort((points).begin(), (points).end());
  int k = 0;
  vector<Point> qs(2 * n);
  for (int i = 0; i < n; qs[k++] = points[i++]) {
    while (k > 1 && cross(qs[k - 1] - qs[k - 2], points[i] - qs[k - 1]) <= 0)
      k--;
  }
  for (int i = n - 2, t = k; i >= 0; qs[k++] = points[i--]) {
    while (k > t && cross(qs[k - 1] - qs[k - 2], points[i] - qs[k - 1]) <= 0)
      k--;
  }
  qs.resize(k - 1);
  return qs;
}
void solve(int n) {
  vector<string> vec(n);
  for (int i = (int)(0); i < (int)(n); i++) cin >> vec[i];
  reverse((vec).begin(), (vec).end());
  auto iszero = [&](int i, int j) {
    if (i < 0 || i >= n || j < 0 || j >= n) return false;
    return vec[i][j] == '0';
  };
  vector<Point> cand;
  for (int i = (int)(0); i < (int)(n + 1); i++)
    for (int j = (int)(0); j < (int)(n + 1); j++) {
      if ([&]() {
            for (int x = (int)(0); x < (int)(2); x++)
              for (int y = (int)(0); y < (int)(2); y++)
                if (iszero(i - x, j - y)) return false;
            return true;
          }()) {
        cand.push_back((Point(j, i)));
      }
    }
  vector<Point> res = GrahamScan(cand);
  int sz = res.size();
  cout << sz << endl;
  for (int i = (int)(0); i < (int)(sz); i++)
    cout << res[(sz - i) % sz].real() << " " << res[(sz - i) % sz].imag()
         << endl;
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  while (cin >> n, n) {
    solve(n);
  }
  return 0;
}
