#include <bits/stdc++.h>
using namespace std;
template <class T>
bool uin(T &a, T b) {
  return a > b ? (a = b, true) : false;
}
template <class T>
bool uax(T &a, T b) {
  return a < b ? (a = b, true) : false;
}
struct TPoint {
  long long x, y;
  TPoint(long long x, long long y) : x(x), y(y) {}
  TPoint operator+(const TPoint &p) const { return TPoint(x + p.x, y + p.y); }
  TPoint operator-(const TPoint &p) const { return TPoint(x - p.x, y - p.y); }
  long long operator%(const TPoint &p) const { return x * p.y - y * p.x; }
  long long operator*(const TPoint &p) const { return x * p.x + y * p.y; }
  long long operator~() const { return *this * *this; }
  bool operator<(const TPoint &p) const {
    return make_pair(x, y) < make_pair(p.x, p.y);
  }
};
bool cmp(const TPoint &a, const TPoint &b) {
  if (a % b) return a % b > 0;
  return ~a < ~b;
}
const int maxn = 210000;
int miny[maxn], maxy[maxn];
int main() {
  ios::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.precision(10);
  cout << fixed;
  int n, m;
  while (1) {
    cin >> n >> m;
    if (!n) break;
    for (int i = 0; i < (int)(n + 10); ++i) miny[i] = 1e9, maxy[i] = -1e9;
    for (int i = 0; i < (int)(m); ++i) {
      int x, y;
      cin >> x >> y;
      uin(miny[x], y);
      uax(maxy[x], y);
    }
    vector<TPoint> p;
    for (int i = 0; i < (int)(n + 2); ++i) {
      if (i && miny[i] < miny[i - 1]) p.push_back(TPoint(i, miny[i]));
      if (miny[i] < miny[i + 1]) p.push_back(TPoint(i - 1, miny[i]));
      if (i && maxy[i] > maxy[i - 1]) p.push_back(TPoint(i, maxy[i] - 1));
      if (maxy[i] > maxy[i + 1]) p.push_back(TPoint(i - 1, maxy[i] - 1));
    }
    TPoint O = *min_element((p).begin(), (p).end());
    for (auto &w : p) w = w - O;
    sort((p).begin(), (p).end(), cmp);
    vector<TPoint> st;
    for (auto w : p) {
      while (st.size() > 1) {
        TPoint prv = st.back(), pprv = st[st.size() - 2];
        if ((w - pprv) % (prv - pprv) >= 0)
          st.pop_back();
        else
          break;
      }
      st.push_back(w);
    }
    reverse((st).begin(), (st).end());
    for (int i = 0; i < (int)(st.size()); ++i) {
      st[i] = st[i] + O;
    }
    int j = min_element((st).begin(), (st).end()) - st.begin();
    cout << st.size() << '\n';
    for (int i = 0; i < (int)(st.size()); ++i) {
      TPoint w = st[(i + j) % st.size()];
      cout << w.x << ' ' << w.y << '\n';
    }
  }
  return 0;
}
