#include <fstream>
#include <iomanip>
#include <algorithm>
#include <vector>
#define ld long double
using namespace std;
ifstream cin("infasuratoare.in");
ofstream cout("infasuratoare.out");
int n,i,l;
struct punct
{
ld x;
ld y;
};
punct varf[120005];
vector<punct>v;
bool compar(punct A,punct B)
{
return A.y<B.y || (A.y==B.y && A.x<B.x);
}
bool orientare(punct A,punct B,punct C)
{
ld cross;
cross=(B.x-A.x)*(C.y-B.y)-(B.y-A.y)*(C.x-B.x);
if(cross<0)
return 0;
return 1;
}
int main()
{
cin>>n;
for(i=1;i<=n;i++)
cin>>varf[i].x>>varf[i].y;
sort(varf+1,varf+n+1,compar);
v.push_back(varf[n]);
v.push_back(varf[1]);
l=2;
for(i=2;i<=n;i++)
{
while(l>=3 && orientare(v[l-2],v[l-1],varf[i])==0)
{
v.pop_back();
l--;
}
v.push_back(varf[i]);
l++;
}
for(i=n-1;i>=1;i--)
{
while(l>=3 && orientare(v[l-2],v[l-1],varf[i])==0)
{
v.pop_back();
l--;
}
v.push_back(varf[i]);
l++;
}
v.pop_back();
l--;
cout<<l-1<<'\n';
for(i=1;i<=l-1;i++)
cout<<fixed<<setprecision(12)<<v[i].x<<' '<<fixed<<setprecision(12)<<v[i].y<<'\n';
return 0;
}