/*
Copyright 2013 Marek "p2004a" Rusinowski
Graham scan
*/
#include <cstdio>
#include <vector>
#include <algorithm>
using namespace std;
class point {
public:
int x, y;
point(int _x, int _y) : x(_x), y(_y) {}
};
inline int det(const point &p0, const point &p1, const point p2) {
return (p1.x - p0.x) * (p2.y - p0.y) - (p2.x - p0.x) * (p1.y - p0.y);
}
inline int d(const point &p1, const point &p2) {
return (p2.x - p1.x) * (p2.x - p1.x) + (p2.y - p1.y) * (p2.y - p1.y);
}
class comp {
point p0;
public:
comp(const point &p) : p0(p) {}
bool operator() (const point &p1, const point &p2) {
int t = det(p0, p1, p2);
if (t > 0) return true;
if (t < 0) return false;
return d(p0, p1) < d(p0, p2);
}
};
vector<point> graham(vector<point> points) {
int idx = 0;
for (int i = 1; i < (int)points.size(); ++i) {
if (points[i].y < points[idx].y || (points[i].y == points[idx].y && points[i].x < points[idx].x)) idx = i;
}
swap(points.back(), points[idx]);
vector<point> out;
out.push_back(points.back());
points.pop_back();
comp cmp(out[0]);
sort(points.begin(), points.end(), cmp);
for (int i = 0; i < (int) points.size(); ++i) {
while (out.size() >= 2 && det(out[out.size() - 2], out.back(), points[i]) < 0) {
out.pop_back();
}
out.push_back(points[i]);
}
return out;
}
int main() {
int n;
scanf("%d", &n);
vector<point> points;
for (int i = 0; i < n; ++i) {
int a, b;
scanf("%d%d", &a, &b);
points.push_back(point(a, b));
}
vector<point> out = graham(points);
for (int i = 0; i < (int) out.size(); ++i) {
printf("%d %d\n", out[i].x, out[i].y);
}
return 0;
}
LyoKICBDb3B5cmlnaHQgMjAxMyBNYXJlayAicDIwMDRhIiBSdXNpbm93c2tpCiAgR3JhaGFtIHNjYW4KKi8KI2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPHZlY3Rvcj4KI2luY2x1ZGUgPGFsZ29yaXRobT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgpjbGFzcyBwb2ludCB7CiBwdWJsaWM6CiAgaW50IHgsIHk7CiAgcG9pbnQoaW50IF94LCBpbnQgX3kpIDogeChfeCksIHkoX3kpIHt9Cn07CgppbmxpbmUgaW50IGRldChjb25zdCBwb2ludCAmcDAsIGNvbnN0IHBvaW50ICZwMSwgY29uc3QgcG9pbnQgcDIpIHsKICByZXR1cm4gKHAxLnggLSBwMC54KSAqIChwMi55IC0gcDAueSkgLSAocDIueCAtIHAwLngpICogKHAxLnkgLSBwMC55KTsKfQoKaW5saW5lIGludCBkKGNvbnN0IHBvaW50ICZwMSwgY29uc3QgcG9pbnQgJnAyKSB7CiAgcmV0dXJuIChwMi54IC0gcDEueCkgKiAocDIueCAtIHAxLngpICsgKHAyLnkgLSBwMS55KSAqIChwMi55IC0gcDEueSk7Cn0KCmNsYXNzIGNvbXAgewogIHBvaW50IHAwOwogcHVibGljOgogIGNvbXAoY29uc3QgcG9pbnQgJnApIDogcDAocCkge30KICBib29sIG9wZXJhdG9yKCkgKGNvbnN0IHBvaW50ICZwMSwgY29uc3QgcG9pbnQgJnAyKSB7CiAgICBpbnQgdCA9IGRldChwMCwgcDEsIHAyKTsKICAgIGlmICh0ID4gMCkgcmV0dXJuIHRydWU7CiAgICBpZiAodCA8IDApIHJldHVybiBmYWxzZTsKICAgIHJldHVybiBkKHAwLCBwMSkgPCBkKHAwLCBwMik7CiAgfQp9OwoKdmVjdG9yPHBvaW50PiBncmFoYW0odmVjdG9yPHBvaW50PiBwb2ludHMpIHsKICBpbnQgaWR4ID0gMDsKICBmb3IgKGludCBpID0gMTsgaSA8IChpbnQpcG9pbnRzLnNpemUoKTsgKytpKSB7CiAgICBpZiAocG9pbnRzW2ldLnkgPCBwb2ludHNbaWR4XS55IHx8IChwb2ludHNbaV0ueSA9PSBwb2ludHNbaWR4XS55ICYmIHBvaW50c1tpXS54IDwgcG9pbnRzW2lkeF0ueCkpIGlkeCA9IGk7CiAgfQogIHN3YXAocG9pbnRzLmJhY2soKSwgcG9pbnRzW2lkeF0pOwogIHZlY3Rvcjxwb2ludD4gb3V0OwogIG91dC5wdXNoX2JhY2socG9pbnRzLmJhY2soKSk7CiAgcG9pbnRzLnBvcF9iYWNrKCk7CiAgY29tcCBjbXAob3V0WzBdKTsKICBzb3J0KHBvaW50cy5iZWdpbigpLCBwb2ludHMuZW5kKCksIGNtcCk7CgogIGZvciAoaW50IGkgPSAwOyBpIDwgKGludCkgcG9pbnRzLnNpemUoKTsgKytpKSB7CiAgICB3aGlsZSAob3V0LnNpemUoKSA+PSAyICYmIGRldChvdXRbb3V0LnNpemUoKSAtIDJdLCBvdXQuYmFjaygpLCBwb2ludHNbaV0pIDwgMCkgewogICAgICBvdXQucG9wX2JhY2soKTsKICAgIH0KICAgIG91dC5wdXNoX2JhY2socG9pbnRzW2ldKTsKICB9CgogIHJldHVybiBvdXQ7Cn0KCmludCBtYWluKCkgewogIGludCBuOwogIHNjYW5mKCIlZCIsICZuKTsKICB2ZWN0b3I8cG9pbnQ+IHBvaW50czsKICBmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewogICAgaW50IGEsIGI7CiAgICBzY2FuZigiJWQlZCIsICZhLCAmYik7CiAgICBwb2ludHMucHVzaF9iYWNrKHBvaW50KGEsIGIpKTsKICB9CiAgdmVjdG9yPHBvaW50PiBvdXQgPSBncmFoYW0ocG9pbnRzKTsKCiAgZm9yIChpbnQgaSA9IDA7IGkgPCAoaW50KSBvdXQuc2l6ZSgpOyArK2kpIHsKICAgIHByaW50ZigiJWQgJWRcbiIsIG91dFtpXS54LCBvdXRbaV0ueSk7CiAgfQogIHJldHVybiAwOwp9Cg==