import java.util.Arrays;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
// 2차원 평면
// x축, y축 (바둑판)
// 입력, 계산, 출력
// 입력: N개의 점 (점 -> x좌표, y좌표) => 쌍
// int x. int y => 점 => 배열 int[]
Scanner sc = new Scanner(System.in);
int N = sc.nextInt(); // 첫번째 등장하는 숫자를 N으로 전달
// N은 점의 개수 -> N만큼의 점(x, y)쌍이 존재한다. -> N번 반복
int[][] pointArr = new int[N][2]; // 점 저장
for (int i = 0; i < N; i++) {
// 점마다 x, y쌍을 받아와야 한다.
int x = sc.nextInt();
int y = sc.nextInt();
// System.out.println("x: " + x + ", y: " + y);
// 이제 저장해줘야 한다.
int[] point = new int[2]; // x, y가 들어갈 2개의 자리가 필요하다.
point[0] = x;
point[1] = y; // (x, y)
pointArr[i] = point;
}
sc.close();
// System.out.println("pointArr");
// for (int[] point : pointArr) {
// System.out.println(point[0] + " " + point[1]);
// }
// 계산: (1)y좌표가 증가하는 순 (2)x좌표가 증가하는 순서로 **정렬**
// Arrays.sort(pointArr);
// 정렬하는 기준. y좌표를 먼저, x좌표가 다음
// 증가하는 순 => 오름차순 (인덱스가 증가하는 순...)
Arrays.sort(pointArr, (e1, e2) -> {
// e1, e2 -> point
// y를 먼저 비교
if (e1[1] != e2[1]) { // point e1, e2의 1(y)가 다를 때
return e1[1] - e2[1]; // y의 차이로 정렬
// sort -> +면 e1이 뒤로가고, -면 e2가 뒤로가고, 0이면 그대로.
} else { // 2개의 y좌표가 같을 때 (e1[1] == e2[1])
return e1[0] - e2[0];
}
// 람다식 -> 1.8이후에 들어온 문법
});
// 메서드를 외부로 별도로 정의하지 않고 넣어주는 방법
// 람다식: (매개변수) -> {메서드의 본문(실행문)}
// System.out.println("Arrays.sort(pointArr)");
for (int[] point : pointArr) {
System.out.println(point[0] + " " + point[1]);
}
// 출력: 정렬한 결과를 출력
}
}