#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+IDAgKSByZXR1cm4gdHJ1ZTsKCWVsc2UgcmV0dXJuIGZhbHNlOwp9CgppbnQgbWFpbigpCnsKCWludCBOLCBhbnMgPSAxOwoJCglzY2FuZigiJWQiLCAmTik7CgkKCWZvcihpbnQgaT0xOyBpPD1OOyArK2kpCgkJc2NhbmYoIiVkICVkIiwgJnBvaW50c1tpXS54LCAmcG9pbnRzW2ldLnkpOwoJCglzb3J0KHBvaW50cysxLCBwb2ludHMrTisxLCBjbXApOwoJc29ydChwb2ludHMrMiwgcG9pbnRzK04rMSwgY21wQW5nbGUpOwoJCglmb3IoaW50IGk9MTtpPD1OOysraSkKCQlwcmludGYoIiVkICVkXG4iLCBwb2ludHNbaV0ueCwgcG9pbnRzW2ldLnkpOwoJCglwb2ludHNbMF0gPSBwb2ludHNbTl07CgkKCWZvcihpbnQgaT0yOyBpPD1OOyArK2kpCgl7CgkJd2hpbGUoIGNjdyhwb2ludHNbYW5zLTFdLCBwb2ludHNbYW5zXSwgcG9pbnRzW2ldKSA8PSAwICkKCQkJaWYoIGFucyA+IDEgKQoJCQl7CgkJCQktLWFuczsKCQkJCWNvbnRpbnVlOwoJCQl9CgkJCWVsc2UgaWYoIGkgPT0gTiApCgkJCQlicmVhazsKCQkJZWxzZSAKCQkJCSsraTsKCQkrK2FuczsKCQlzd2FwKHBvaW50c1thbnNdLCBwb2ludHNbaV0pOwoJfQoJCglwcmludGYoIiVkIiwgYW5zKTsKCQoJcmV0dXJuIDA7CQp9