#include<bits/stdc++.h>
using namespace std;
#define PI 3.141592653589793
#define eps 0.00000001
#define fs first
#define sc second
#define pb push_back
#define mp make_pair
typedef pair<double,double> pdd;
int N;
vector<pdd> v;
int cmp(double a, double b) {
if(a + eps <= b) return -1; if(a < b + eps) return 0; return 1;
}
int cmp(pdd a, pdd b) {
int t = cmp(a.fs, b.fs); if(t) return t; return cmp(a.sc,b.sc);
}
pdd in = mp(INFINITY, INFINITY); //no solution
pdd operator+(pdd a, pdd b) { return mp(a.fs+b.fs, a.sc+b.sc); }
pdd operator-(pdd a, pdd b) { return mp(a.fs-b.fs, a.sc-b.sc); }
pdd operator*(pdd a, double t) { return mp(a.fs*t, a.sc*t); }
pdd operator/(pdd a, double t) { return mp(a.fs/t, a.sc/t); }
double operator*(pdd a, pdd b) { return a.fs*b.fs + a.sc*b.sc; }
double operator%(pdd a, pdd b) { return a.fs*b.sc - a.sc*b.fs; }
bool operator<(pdd a, pdd b) { return cmp(a,b) < 0; }
bool operator==(pdd a, pdd b) { return cmp(a,b) == 0; }
double norm(pdd a) { return sqrt(a*a); }
double arg(pdd a) { return atan2(a.sc,a.fs); }
inline double dist(pdd p, pdd q) { return norm(p-q);}
inline int ccw(pdd a, pdd b, pdd c) { return cmp((a-c)%(b-c),0);}
pdd V; int cmpv(pdd a, pdd b) { return ccw(V,a,b) < 0;}
vector<pdd> hull(vector<pdd> &a) { //graham
vector<pdd> b; sort(a.begin(),a.end()); V = a[0];
sort(a.begin()+1,a.end(),cmpv);
for(int i = 0; i < a.size(); ++i) {
while(b.size() >= 2 && ccw(b[b.size()-2],b[b.size()-1],a[i]) >= 0) {
b.pop_back();
}
b.pb(a[i]);
}
return b;
}
int main() {
freopen("infasuratoare.in","r",stdin);
freopen("infasuratoare.out","w",stdout);
scanf("%d",&N);
v.resize(N);
for(int i=0;i<N;++i) {
scanf("%lf%lf\n",&v[i].fs,&v[i].sc);
}
v = hull(v);
printf("%d\n",v.size());
for(auto p: v) {
printf("%.6lf %.6lf\n",p.fs,p.sc);
}
}