#include <iostream>
#include <vector>
#include <algorithm>


struct pair {
	int a, b;
	pair(int a, int b) : a(a), b(b) {}
	
	std::ostream &print(std::ostream &out) const {
		return (out << "(" << a << ", " << b << ")");
	}
};

std::ostream &operator<<(std::ostream &out, const pair &p) { return p.print(out); }

struct topological_pair_comparator {
	bool operator()(const pair &p, const pair &q) const { return p.a<q.a && p.b<q.b; }
} tpc;

std::vector<pair> pairs = {
	pair(1,1),
	pair(1,2),
	pair(2,1),
	pair(3,1),
	pair(1,3),
	pair(5,5),
	pair(2,2),
	pair(4,0)
};

int main() {
	std::sort(pairs.begin(), pairs.end(), tpc);
	for(const pair &p : pairs) std::cout << p << " ";
	std::cout << std::endl;
	return 0;
}