const int N=10001;
struct point{
int x;
int y;
}p[N],q[N];
int n,per[N],l;
inline point getmag(point a,point b){
point s;
s.x=b.x-a.x;s.y=b.y-a.y;
return s;
}
inline int multiX(point a,point b){
return a.x*b.y-b.x*a.y;
}
inline int dis(point a,point b){
return (a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y);
}
inline bool cmp(int u,int v){
int det=multiX(getmag(p[1],p[u]),getmag(p[1],p[v]));
if(det!=0)return det>0;
return dis(p[1],p[u])<dis(p[1],p[v]);
}
void graham(){//凸包点从1开始到l
int id=1;
for(int i=2;i<=n;i++){
if(p[i].x<p[id].x||(p[i].x==p[id].x&&p[i].y<p[id].y))id=i;
}
if(id!=1)swap(p[1],p[id]);
for(int i=1;i<=n;i++)per[i]=i;
sort(per+2,per+n+1,cmp);
q[++l]=p[1];
for(int i=2;i<=n;i++){
int j=per[i];
while(l>=2&&multiX(getmag(q[l-1],p[j]),getmag(q[l-1],q[l]))>=0)l--;
q[++l]=p[j];
}
return;
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++)scanf("%d%d",&p[i].x,&p[i].y);
graham();
return 0;
}