#include <stdio.h>
#include <algorithm>
using namespace std;
typedef struct point
{
int y, x;
}POINT;
POINT points[100001];
inline double ccw(const POINT &p1, const POINT &p2, const POINT &p3)
{
return (p2.x - p1.x)*(p3.y - p1.y) - (p2.y - p1.y)*(p3.x - p1.x);
}
inline bool cmp(const POINT &p, const POINT &q)
{
if( p.y < q.y ) return true;
else if( p.y == q.y )
{
if( p.x <= q.x ) return true;
else return false;
}
else return false;
}
inline bool cmpAngle(const POINT &p, const POINT &q)
{
if( ccw(points[1], p, q) >= 0 ) return true;
else return false;
}
int main()
{
int N, ans = 1;
scanf("%d", &N);
for(int i=1; i<=N; ++i)
scanf("%d %d", &points[i].x, &points[i].y);
sort(points+1, points+N+1, cmp);
sort(points+2, points+N+1, cmpAngle);
for(int i=1;i<=N;++i)
printf("%d %d\n", points[i].x, points[i].y);
points[0] = points[N];
for(int i=2; i<=N; ++i)
{
while( ccw(points[ans-1], points[ans], points[i]) <= 0 )
if( ans > 1 )
{
--ans;
continue;
}
else if( i == N )
break;
else
++i;
++ans;
swap(points[ans], points[i]);
}
printf("%d", ans);
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxhbGdvcml0aG0+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKdHlwZWRlZiBzdHJ1Y3QgcG9pbnQKewoJaW50IHksIHg7CQp9UE9JTlQ7CgpQT0lOVCBwb2ludHNbMTAwMDAxXTsKCmlubGluZSBkb3VibGUgY2N3KGNvbnN0IFBPSU5UICZwMSwgY29uc3QgUE9JTlQgJnAyLCBjb25zdCBQT0lOVCAmcDMpCnsKCXJldHVybiAocDIueCAtIHAxLngpKihwMy55IC0gcDEueSkgLSAocDIueSAtIHAxLnkpKihwMy54IC0gcDEueCk7Cn0KCmlubGluZSBib29sIGNtcChjb25zdCBQT0lOVCAmcCwgY29uc3QgUE9JTlQgJnEpIAp7CglpZiggcC55IDwgcS55ICkgcmV0dXJuIHRydWU7CgllbHNlIGlmKCBwLnkgPT0gcS55ICkKCXsKCQlpZiggcC54IDw9IHEueCApIHJldHVybiB0cnVlOwoJCWVsc2UgcmV0dXJuIGZhbHNlOwoJfQoJZWxzZSByZXR1cm4gZmFsc2U7Cn0KCmlubGluZSBib29sIGNtcEFuZ2xlKGNvbnN0IFBPSU5UICZwLCBjb25zdCBQT0lOVCAmcSkgCnsKCWlmKCBjY3cocG9pbnRzWzFdLCBwLCBxKSA+PSAwICkgcmV0dXJuIHRydWU7CgllbHNlIHJldHVybiBmYWxzZTsKfQoKaW50IG1haW4oKQp7CglpbnQgTiwgYW5zID0gMTsKCQoJc2NhbmYoIiVkIiwgJk4pOwoJCglmb3IoaW50IGk9MTsgaTw9TjsgKytpKQoJCXNjYW5mKCIlZCAlZCIsICZwb2ludHNbaV0ueCwgJnBvaW50c1tpXS55KTsKCQoJc29ydChwb2ludHMrMSwgcG9pbnRzK04rMSwgY21wKTsKCXNvcnQocG9pbnRzKzIsIHBvaW50cytOKzEsIGNtcEFuZ2xlKTsKCQoJZm9yKGludCBpPTE7aTw9TjsrK2kpCgkJcHJpbnRmKCIlZCAlZFxuIiwgcG9pbnRzW2ldLngsIHBvaW50c1tpXS55KTsKCQoJcG9pbnRzWzBdID0gcG9pbnRzW05dOwoJCglmb3IoaW50IGk9MjsgaTw9TjsgKytpKQoJewoJCXdoaWxlKCBjY3cocG9pbnRzW2Fucy0xXSwgcG9pbnRzW2Fuc10sIHBvaW50c1tpXSkgPD0gMCApCgkJCWlmKCBhbnMgPiAxICkKCQkJewoJCQkJLS1hbnM7CgkJCQljb250aW51ZTsKCQkJfQoJCQllbHNlIGlmKCBpID09IE4gKQoJCQkJYnJlYWs7CgkJCWVsc2UgCgkJCQkrK2k7CgkJKythbnM7CgkJc3dhcChwb2ludHNbYW5zXSwgcG9pbnRzW2ldKTsKCX0KCQoJcHJpbnRmKCIlZCIsIGFucyk7CgkKCXJldHVybiAwOwkKfQ==