#include <bits/stdc++.h>
using namespace std;
int g[510][510];
int n, m;
vector<pair<int, int> > p, u, d;
int ccw(pair<int, int> a, pair<int, int> b, pair<int, int> c) {
  int dx1 = b.first - a.first, dy1 = b.second - a.second;
  int dx2 = c.first - b.first, dy2 = c.second - b.second;
  return (dx1 * dy2 - dx2 * dy1 >= 0);
}
bool cmp(pair<int, int> a, pair<int, int> b) {
  if (a.first == b.first) return a.second > b.second;
  return a.first < b.first;
}
set<pair<int, int> > s;
int l[100010], r[100010], x, y;
vector<pair<int, int> > pt;
bool in(int a, int b) {
  if (s.find(make_pair(a, b)) != s.end()) return 1;
  if (a >= l[b] && a <= r[b]) return 1;
  return 0;
}
int dirx[] = {-1, 0, 1, 1, 1, 0, -1, -1};
int diry[] = {1, 1, 1, 0, -1, -1, -1, 0};
bool can[8];
int main() {
  while (scanf("%d%d", &n, &m), n != 0) {
    p.clear();
    u.clear();
    d.clear();
    s.clear();
    pt.clear();
    for (int i = 0; i <= n; i++) {
      l[i] = 1000000000, r[i] = -2;
    }
    for (int i = 0; i < m; i++) {
      scanf("%d%d", &x, &y);
      l[y] = min(l[y], x);
      r[y] = max(r[y], x);
      s.insert(make_pair(x, y));
      pt.push_back(make_pair(x, y));
    }
    for (int i = 0; i < (int)(pt).size(); i++) {
      x = pt[i].first, y = pt[i].second;
      for (int j = 0; j < 8; j++) {
        can[j] = in(x + dirx[j], y + diry[j]);
      }
      if (can[0] && can[1] && can[7]) {
        p.push_back(make_pair(x, y + 1));
      }
      if (can[1] && can[2] && can[3]) {
        p.push_back(make_pair(x + 1, y + 1));
      }
      if (can[3] && can[4] && can[5]) {
        p.push_back(make_pair(x + 1, y));
      }
      if (can[5] && can[6] && can[7]) {
        p.push_back(make_pair(x, y));
      }
    }
    sort((p).begin(), (p).end(), cmp);
    p.resize(distance(p.begin(), unique((p).begin(), (p).end())));
    u.push_back(p[0]);
    for (int i = 0; i < (int)(p).size(); i++) {
      while ((int)(u).size() > 1 &&
             ccw(u[(int)(u).size() - 2], u[(int)(u).size() - 1], p[i])) {
        u.pop_back();
      }
      u.push_back(p[i]);
    }
    d.push_back(p[(int)(p).size() - 1]);
    for (int i = (int)(p).size() - 2; i >= 0; i--) {
      while ((int)(d).size() > 1 &&
             ccw(d[(int)(d).size() - 2], d[(int)(d).size() - 1], p[i])) {
        d.pop_back();
      }
      d.push_back(p[i]);
    }
    for (int i = 1; i < (int)(d).size() - 1; i++) {
      u.push_back(d[i]);
    }
    int s = (int)(u).size();
    printf("%d\n", s);
    int rr = (min_element((u).begin(), (u).end())) - u.begin();
    for (int i = 0; i < s; i++) {
      printf("%d %d\n", u[(rr + i) % s].first - 1, u[(rr + i) % s].second - 1);
    }
  }
}
