#include <bits/stdc++.h>
using namespace std;
long long vectorMult(pair<int, int> a, pair<int, int> b, pair<int, int> c) {
  return (c.first - a.first) * 1ll * (b.second - a.second) -
         (c.second - a.second) * 1ll * (b.first - a.first);
}
bool cmp(pair<int, int> a, pair<int, int> b) {
  return a.first < b.first || a.first == b.first && a.second < b.second;
}
vector<pair<int, int> > convex_hull(vector<pair<int, int> > t) {
  if (t.size() == 1) return t;
  sort(t.begin(), t.end(), cmp);
  vector<pair<int, int> > up, down;
  auto l = t[0];
  auto r = t.back();
  up.push_back(t[0]);
  down.push_back(t[0]);
  for (int i = 1; i < t.size(); i++) {
    if (vectorMult(l, r, t[i]) <= 0) {
      while (up.size() >= 2 &&
             vectorMult(up[up.size() - 2], up.back(), t[i]) <= 0) {
        up.pop_back();
      }
      up.push_back(t[i]);
    }
    if (vectorMult(l, r, t[i]) >= 0) {
      while (down.size() >= 2 &&
             vectorMult(down[down.size() - 2], down.back(), t[i]) >= 0) {
        down.pop_back();
      }
      down.push_back(t[i]);
    }
  }
  up.insert(up.end(), down.rbegin() + 1, down.rend() - 1);
  if (up.size() == 2 && up[0] == up[1]) up.pop_back();
  return up;
}
bool check(int x, int y, map<int, int> &l, map<int, int> &r,
           set<pair<int, int> > &s) {
  if (s.count(make_pair(x, y))) return true;
  if (!l.count(y)) return false;
  return l[y] <= x && r[y] >= x;
}
int main() {
  ios_base::sync_with_stdio(0);
  while (true) {
    int n, m;
    cin >> n >> m;
    if (n == 0) break;
    vector<pair<int, int> > t(m);
    set<pair<int, int> > s, ms;
    map<int, int> l, r;
    for (int i = 0; i < m; i++) {
      cin >> t[i].first >> t[i].second;
      s.insert(t[i]);
      ms.insert(t[i]);
      s.insert(make_pair(t[i].first + 1, t[i].second));
      s.insert(make_pair(t[i].first + 1, t[i].second + 1));
      s.insert(make_pair(t[i].first + 1, t[i].second - 1));
      s.insert(make_pair(t[i].first - 1, t[i].second));
      s.insert(make_pair(t[i].first - 1, t[i].second + 1));
      s.insert(make_pair(t[i].first - 1, t[i].second - 1));
      s.insert(make_pair(t[i].first, t[i].second - 1));
      s.insert(make_pair(t[i].first, t[i].second + 1));
      int y = t[i].second;
      if (l.count(y)) {
        l[y] = min(l[y], t[i].first);
        r[y] = max(r[y], t[i].first);
      } else {
        l[y] = t[i].first;
        r[y] = t[i].first;
      }
    }
    vector<pair<int, int> > f;
    for (auto &it : s) {
      if (check(it.first, it.second, l, r, ms) &&
          check(it.first + 1, it.second, l, r, ms) &&
          check(it.first, it.second + 1, l, r, ms) &&
          check(it.first + 1, it.second + 1, l, r, ms)) {
        f.push_back(make_pair(it.first, it.second));
      }
    }
    f = convex_hull(f);
    int mn = 0;
    for (int i = 1; i < f.size(); i++)
      if (f[i] < f[mn]) {
        mn = i;
      }
    vector<pair<int, int> > ans;
    ans.insert(ans.end(), f.begin() + mn, f.end());
    ans.insert(ans.end(), f.begin(), f.begin() + mn);
    cout << ans.size() << endl;
    for (auto it : ans) cout << it.first << " " << it.second << endl;
  }
  return 0;
}
