#include <cstdio>
#include <algorithm>
FILE* in=fopen("infasuratoare.in","r");
FILE* out=fopen("infasuratoare.out","w");
const int Q=120001;
struct point{
double x,y;
} v[Q];
int n;
int inline clock(const point &a,const point &b,const point &c)
{
double aux;
aux=(double)(b.x-a.x)*(c.y-a.y)-(double)(c.x-a.x)*(b.y-a.y);
if(aux>0)
return 1;
if(aux<0)
return -1;
return 0;
}
int ord[Q];
int stv[Q];
int ymin=1;
void select()
{
stv[++stv[0]]=1;
stv[++stv[0]]=ord[2];
if(v[stv[stv[0]]].y<v[stv[ymin]].y)
ymin=stv[0];
for(int i=3; i<=n; i++)
{
while(stv[0]!=0 && clock(v[stv[stv[0]-1]],v[stv[stv[0]]],v[ord[i]])==-1)
{
stv[0]--;
}
if(clock(v[stv[stv[0]-1]],v[stv[stv[0]]],v[ord[i]])==0)
{
if(v[stv[stv[0]]].x<v[ord[i]].x)
{
stv[0]--;
while(stv[0]!=0 && clock(v[stv[stv[0]-1]],v[stv[stv[0]]],v[ord[i]])==-1)
{
stv[0]--;
}
stv[++stv[0]]=ord[i];
}
}
else
stv[++stv[0]]=ord[i];
if(v[stv[stv[0]-1]].y<v[stv[ymin]].y)
ymin=stv[0]-1;
}
if(v[stv[stv[0]]].y<v[stv[ymin]].y)
ymin=stv[0];
}
void q_sort(const int &st0,const int &dr0)
{
int st=st0,dr=dr0;
if(st>=dr)
return;
int p=st++,aux;
while(st<=dr)
{
if(p<st)
{
if(clock(v[1],v[ord[st] ], v[ord[p] ] )==1)
{
aux=ord[p];
ord[p]=ord[st];
ord[st]=aux;
}
st++;
}
else
{
if(clock(v[1],v[ord[p]],v[ord[dr]])==1)
{
aux=ord[p];
ord[p]=ord[dr];
ord[dr]=aux;
}
dr--;
}
}
q_sort(st0,p-1);
q_sort(p+1,dr0);
}
bool cmp(const int &a, const int &b)
{
return clock(v[1],v[a],v[b])==1;
}
int max;
void sort()
{
for(int i=2; i<=n; i++)
{
ord[i]=i;
}
std::sort(ord+2,ord+n+1,cmp);
//q_sort(2,n); Nu intra in timp
int i;
max=1;
for(i=n; v[ord[i]].x==v[1].x; i--)
{
if(v[ord[i]].y>v[max].y)
max=ord[i];
}
if(max!=1)
{
n=++i;
ord[n]=max;
}
// for(int i=1; i<=n; i++)
// fprintf(out,"%d -? %.2lf %.2lf\n",ord[i],v[ord[i]].x,v[ord[i]].y);
}
void read()
{
int min=1;
for(int i=1; i<=n; i++)
{
fscanf(in,"%lf %lf",&v[i].x,&v[i].y);
if(v[i].x==v[min].x && v[i].y<v[min].y)
min=i;
if(v[i].x<v[min].x)
min=i;
}
double aux;
aux=v[1].x;
v[1].x=v[min].x;
v[min].x=aux;
aux=v[1].y;
v[1].y=v[min].y;
v[min].y=aux;
}
int main()
{
fscanf(in,"%d",&n);
read();
sort();
select();
if(max!=1 && stv[stv[0]]!=max)
{
while(stv[0]!=0 && clock(v[stv[stv[0]-1]],v[stv[stv[0]]],v[max]) != 1)
{
stv[0]--;
}
stv[++stv[0]]=max;
}
fprintf(out,"%d\n",stv[0]);
for(int i=ymin; i<=stv[0]; i++)
{
fprintf(out,"%lf %lf\n",v[stv[i]].x,v[stv[i]].y);
}
for(int i=1; i<ymin; i++)
{
fprintf(out,"%lf %lf\n",v[stv[i]].x,v[stv[i]].y);
}
fclose(in);
fclose(out);
return 0;
}