#include <bits/stdc++.h>
using namespace std;
struct Point {
  int x, y;
  Point(int x = 0, int y = 0) : x(x), y(y) {}
};
Point operator+(Point A, Point B) { return Point(A.x + B.x, A.y + B.y); }
Point operator-(Point A, Point B) { return Point(A.x - B.x, A.y - B.y); }
Point operator*(Point A, int p) { return Point(A.x * p, A.y * p); }
Point operator/(Point A, int p) { return Point(A.x / p, A.y / p); }
int dcmp(int x) {
  if (x == 0)
    return 0;
  else
    return x < 0 ? -1 : 1;
}
bool operator<(const Point& a, const Point& b) {
  return a.x < b.x || (a.x == b.x && a.y < b.y);
}
bool operator==(const Point& a, const Point& b) {
  return dcmp(a.x - b.x) == 0 && dcmp(a.y - b.y) == 0;
}
bool cmp(const Point& a, const Point& b) {
  if (a.x == b.x) return a.y < b.y;
  return a.x < b.x;
}
int Cross(Point A, Point B) { return A.x * B.y - A.y * B.x; }
vector<Point> ConvexHull(vector<Point> p) {
  sort(p.begin(), p.end());
  p.erase(unique(p.begin(), p.end()), p.end());
  int n = p.size();
  vector<Point> ch(n + 1);
  int m = 0;
  for (int i = 0; i < n; i++) {
    while (m > 1 && dcmp(Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2])) <= 0)
      m--;
    ch[m++] = p[i];
  }
  int k = m;
  for (int i = n - 2; i >= 0; i--) {
    while (m > k && dcmp(Cross(ch[m - 1] - ch[m - 2], p[i] - ch[m - 2])) <= 0)
      m--;
    ch[m++] = p[i];
  }
  if (n > 1) m--;
  ch.resize(m);
  return ch;
}
vector<Point> p;
int a[510][510];
int N;
char room[510][510];
void init() { p.clear(); }
int jud(int x, int y) {
  if (x < 0 || y < 0 || x > N || y > N) return 0;
  return 1;
}
int main() {
  while (~scanf("%d", &N) && N) {
    init();
    for (int i = 0; i < N; i++) {
      scanf("%s", room[i]);
      for (int j = 0; j < N; j++) {
        a[j][N - i - 1] = room[i][j] - '0';
      }
    }
    for (int i = 0; i < N - 1; i++) {
      for (int j = 0; j < N - 1; j++) {
        if (a[i][j] && a[i + 1][j] && a[i][j + 1] && a[i + 1][j + 1]) {
          p.push_back(Point(i + 1, j + 1));
        }
      }
    }
    p = ConvexHull(p);
    printf("%d\n", p.size());
    if (p.size()) {
      printf("%d %d\n", p[0].x, p[0].y);
    }
    for (int i = p.size() - 1; i >= 1; i--) {
      printf("%d %d\n", p[i].x, p[i].y);
    }
  }
  return 0;
}
