#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define f1 first
#define s2 second
#define fastio ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);
#define debug(x...) cerr << "[" << #x << "]: " << x << "\n";
using ll = long long;
using ld = long double;
using ii = pair<int, int>;
using pl = pair<ll, ll>;
ld const PI = 4*atan((ld)1);
struct Point
{
ll x, y;
Point() : x(0), y(0) {}
Point(int p, int q) : x(p), y(q) {}
string out() const
{
string res = "";
res += "(";
res += to_string(x);
res += ",";
res += to_string(y);
res += ")";
return res;
}
bool operator<(Point const &other) const { return x < other.x || (x == other.x && y < other.y); }
bool operator==(Point const &other) const { return x == other.x && y == other.y; }
};
int orientation(Point a, Point b, Point c)
{
int o = (a.y - b.y) * (b.x - c.x) - (a.x - b.x) * (b.y - c.y);
if (o == 0)
return 0;
return o > 0 ? -1 : 1; // CW : CCW
}
int main()
{
fastio;
int n;
cin >> n;
vector<Point> v(n);
for (Point &p : v)
cin >> p.x >> p.y;
sort(v.begin(), v.end());
for (int i = 0; i < v.size(); ++i)
cout << v[i].x << "," << v[i].y << " -- ";
return 0;
/*
cerr << '\n';
sort(v.begin(), v.end(), [&](Point const &p, Point const &q){
return !(p < q);
//cout << p.out() << " " << q.out() << " -> " << orientation(v[0], p, q) << '\n';
//return orientation(v[0], p, q) == 1;
});
for (int i = 0; i < v.size(); ++i)
cerr << v[i].x << "," << v[i].y << " -- ";
cerr << '\n';
vector<Point> hull;
for (Point p : v)
{
while (hull.size() >= 2)
{
Point a = hull[hull.size() - 2];
Point b = hull.back();
if (orientation(a, b, p) != 1)
hull.pop_back();
else break;
}
hull.pb(p);
}
cout << hull.size() << '\n';
for (Point p : hull)
cout << p.x << " " << p.y << '\n';
*/
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIG1wIG1ha2VfcGFpcgojZGVmaW5lIGYxIGZpcnN0CiNkZWZpbmUgczIgc2Vjb25kCgojZGVmaW5lIGZhc3RpbyBpb3MgOjogc3luY193aXRoX3N0ZGlvKDApOyBjaW4udGllKDApOyBjb3V0LnRpZSgwKTsKI2RlZmluZSBkZWJ1Zyh4Li4uKSBjZXJyIDw8ICJbIiA8PCAjeCA8PCAiXTogIiA8PCB4IDw8ICJcbiI7Cgp1c2luZyBsbCA9IGxvbmcgbG9uZzsKdXNpbmcgbGQgPSBsb25nIGRvdWJsZTsKdXNpbmcgaWkgPSBwYWlyPGludCwgaW50PjsKdXNpbmcgcGwgPSBwYWlyPGxsLCBsbD47CgpsZCBjb25zdCBQSSA9IDQqYXRhbigobGQpMSk7CgpzdHJ1Y3QgUG9pbnQKewoJbGwgeCwgeTsKCVBvaW50KCkgOiB4KDApLCB5KDApIHt9CglQb2ludChpbnQgcCwgaW50IHEpIDogeChwKSwgeShxKSB7fQoKCXN0cmluZyBvdXQoKSBjb25zdAoJewoJCXN0cmluZyByZXMgPSAiIjsKCQlyZXMgKz0gIigiOwoJCXJlcyArPSB0b19zdHJpbmcoeCk7CgkJcmVzICs9ICIsIjsKCQlyZXMgKz0gdG9fc3RyaW5nKHkpOwoJCXJlcyArPSAiKSI7CgkJcmV0dXJuIHJlczsKCX0KCglib29sIG9wZXJhdG9yPChQb2ludCBjb25zdCAmb3RoZXIpIGNvbnN0IHsgcmV0dXJuIHggPCBvdGhlci54IHx8ICh4ID09IG90aGVyLnggJiYgeSA8IG90aGVyLnkpOyB9Cglib29sIG9wZXJhdG9yPT0oUG9pbnQgY29uc3QgJm90aGVyKSBjb25zdCB7IHJldHVybiB4ID09IG90aGVyLnggJiYgeSA9PSBvdGhlci55OyB9Cn07CgppbnQgb3JpZW50YXRpb24oUG9pbnQgYSwgUG9pbnQgYiwgUG9pbnQgYykKewoJaW50IG8gPSAoYS55IC0gYi55KSAqIChiLnggLSBjLngpIC0gKGEueCAtIGIueCkgKiAoYi55IC0gYy55KTsKCglpZiAobyA9PSAwKQoJCXJldHVybiAwOwoJcmV0dXJuIG8gPiAwID8gLTEgOiAxOyAvLyBDVyA6IENDVwp9CgppbnQgbWFpbigpCnsKCWZhc3RpbzsKCglpbnQgbjsKCWNpbiA+PiBuOwoKCXZlY3RvcjxQb2ludD4gdihuKTsKCWZvciAoUG9pbnQgJnAgOiB2KQoJCWNpbiA+PiBwLnggPj4gcC55OwoKCXNvcnQodi5iZWdpbigpLCB2LmVuZCgpKTsKCWZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7ICsraSkKCQljb3V0IDw8IHZbaV0ueCA8PCAiLCIgPDwgdltpXS55IDw8ICIgLS0gIjsKCXJldHVybiAwOwoJLyoKCWNlcnIgPDwgJ1xuJzsKCglzb3J0KHYuYmVnaW4oKSwgdi5lbmQoKSwgWyZdKFBvaW50IGNvbnN0ICZwLCBQb2ludCBjb25zdCAmcSl7CgkJcmV0dXJuICEocCA8IHEpOwoKCQkvL2NvdXQgPDwgcC5vdXQoKSA8PCAiICIgPDwgcS5vdXQoKSA8PCAiIC0+ICIgPDwgb3JpZW50YXRpb24odlswXSwgcCwgcSkgPDwgJ1xuJzsKCQkvL3JldHVybiBvcmllbnRhdGlvbih2WzBdLCBwLCBxKSA9PSAxOwoJfSk7CgoKCWZvciAoaW50IGkgPSAwOyBpIDwgdi5zaXplKCk7ICsraSkKCQljZXJyIDw8IHZbaV0ueCA8PCAiLCIgPDwgdltpXS55IDw8ICIgLS0gIjsKCWNlcnIgPDwgJ1xuJzsKCgl2ZWN0b3I8UG9pbnQ+IGh1bGw7Cglmb3IgKFBvaW50IHAgOiB2KQoJewoJCXdoaWxlIChodWxsLnNpemUoKSA+PSAyKQoJCXsKCQkJUG9pbnQgYSA9IGh1bGxbaHVsbC5zaXplKCkgLSAyXTsKCQkJUG9pbnQgYiA9IGh1bGwuYmFjaygpOwoKCQkJaWYgKG9yaWVudGF0aW9uKGEsIGIsIHApICE9IDEpCgkJCQlodWxsLnBvcF9iYWNrKCk7CgkJCWVsc2UgYnJlYWs7CgkJfQoJCWh1bGwucGIocCk7Cgl9CgoJY291dCA8PCBodWxsLnNpemUoKSA8PCAnXG4nOwoJZm9yIChQb2ludCBwIDogaHVsbCkKCQljb3V0IDw8IHAueCA8PCAiICIgPDwgcC55IDw8ICdcbic7CgkqLwoJcmV0dXJuIDA7Cn0K