#include<stdio.h>
#include<utility>
#include<algorithm>
#define N 120010
#define punct pair< double , double >
#define X first
#define Y second
using namespace std;
int n,i,vf,comp(punct A,punct B);
punct P[N],ST[N];
double u,v,mic=0.00000001,DET(punct A,punct B,punct C),DIST(punct A,punct B);
void read(),solve(),convex_hull(),prints();
int ord(punct A,punct B,punct C);
int main()
{
read();
solve();
return 0;
}
void read()
{
punct Q;int iq;
freopen("infasuratoare.in","r",stdin);
freopen("infasuratoare.out","w",stdout);
scanf("%d",&n);
scanf("%lf%lf",&u,&v);P[0]=make_pair(u,v);
Q=P[0];iq=0;
for(i=1;i<n;i++)
{
scanf("%lf%lf",&u,&v);
P[i]=make_pair(u,v);
if(P[i]<Q){iq=i;Q=P[i];}
}
Q=P[iq];P[iq]=P[0];P[0]=Q;
}
void solve()
{
sort(P+1,P+n,comp);
convex_hull();
printf("%d\n",vf+1);
for(i=0;i<=vf;i++)
printf("%.6lf %.6lf\n",ST[i].X,ST[i].Y);
}
int ord(punct A,punct B,punct C)
{
double delta=DET(A,B,C),AB,AC;
if(delta>mic)return 1;
if(delta<-mic)return 0;
AB=DIST(A,B);AC=DIST(A,C);
if(AC-AB>mic)return 1;
return 0;
}
int comp(punct A,punct B)
{
double delta=DET(P[0],A,B),rA,rB;
if(delta>mic)return 1;
if(delta<-mic)return 0;
rA=DIST(P[0],A);rB=DIST(P[0],B);
if(rB-rA>mic)return 1;
return 0;
}
void convex_hull()
{
ST[0]=P[0];ST[1]=P[1];vf=1;
for(i=2;i<n;i++)
{
while(!ord(ST[vf-1],ST[vf],P[i]))vf--;
vf++;ST[vf]=P[i];
}
}
double DET(punct A,punct B,punct C)
{
return A.X*B.Y+B.X*C.Y+C.X*A.Y-A.Y*B.X-B.Y*C.X-C.Y*A.X;
}
double DIST(punct A,punct B)
{
return (A.X-B.X)*(A.X-B.X)+(A.Y-B.Y)*(A.Y-B.Y);
}