#include <stdio.h>

#include <math.h>

#include <limits.h>

#define MAX_N 1000

// 점 구조체

typedef struct _point {

double x, y;

}point;

typedef struct _segment {

struct _point e1, e2;

}segment;

// graham's scan 기준점 찾는 함수 : y 가 제일 낮고 x 가 제일 큰 녀석

double compare(point p1, point p2)

{

double comp;

comp = p1.y - p2.y;

if (comp == 0.0) comp = p1.x - p2.x;

return comp;

}

// 점 p가 선분 s의 어느쪽(시계/반시계)에 있는지 판별

// 양수 : 반시계방향

// 0 또는 음수 : 시계방향

double WhichSide(point p, segment s)

{

double a, b;

a = (p.x - s.e1.x) * (s.e2.y - s.e1.y);

b = (p.y - s.e1.y) * (s.e2.x - s.e1.x);

return a - b;

}

// 원점에 대한 점 (dx1, dy1)의 각도와 원점에 대한 점(dx2, dy2)의 각도비교

// sort 에 사용할 함수

int comp(double dx1, double dy1, double dx2, double dy2)

{

double angle1, angle2;

angle1 = atan2(dy1, dx1);

angle2 = atan2(dy2, dx2);

if (angle1 < angle2) return -1;

if (angle1 > angle2) return 1;

return 0;

}

// 두점 p1, p2의 거리계산

double Dist(point p1, point p2)

{

double dist;

dist = sqrt( (p1.x - p2.x)*(p1.x - p2.x) + (p1.y - p2.y)*(p1.y - p2.y) );

return dist;

}

// grahamscan 을 위해 각도순으로 점들의 배열을 정렬

// 이미 0번째에는 기준점이 들어가있음

void sort(point *p, int n)

{

point temp;

int i, j;

for(i = 1; i < n; i++)	{

for(j = 1; j < n-1; j++)	{

if (comp(p[j].x - p[0].x,	p[j].y - p[0].y,

p[j+1].x - p[0].x,	p[j+1].y - p[0].y	) > 0)	{

temp = p[j];

p[j] = p[j+1];

p[j+1] = temp;

}

}

} // end - for

}

// Graham's scan function

void graham_scan(int n, int *m, point *p)

{

int i, min;

point q;

segment l;

// y 가 제일 낮고 x 가 최대인 점을 0번째에 집어넣는다.

min = 0;

for(i = 1; i < n; i++)	{

if(compare(p[i], p[min]) < 0) min = i;

}

q = p[0];

p[0] = p[min];

p[min] = q;

// 0번 점을 기준으로 각정렬을 한다.

sort(p, n);

*m = 1;

for(i = 2; i < n; i++)	{

l.e2 = p[i];	// 임의의 직선의 끝점을 p[i]로 잡는다.

while (*m > 0) {

l.e1 = p[*m -1];

// 만약 반시계방향이면 m 감소

if (WhichSide(p[*m], l) <= 0) (*m)--;

else break;

}

(*m)++;

q = p[*m];

p[*m] = p[i];

p[i] = q;

}

}

void main(void)

{

int num_of_set;

double px, py;

int i, j;

point p[MAX_N];

int num_of_point;

int m;

scanf("%d", &num_of_point);

for(j = 0; j < num_of_point; j++)	{

scanf("%lf %lf", &px, &py);

p[j].x = px;

p[j].y = py;

}

graham_scan(num_of_point, &m, p);

for(i = 0; i <= m; i++)

printf("%lf %lf\n", p[i].x, p[i].y);

}