//用一维数组存储学号和成绩,然后按成绩排序输出
//输入的第一行中包括一个整数N(1<=N<=100),它代表学生的个数
//接下来的N行中,每行包括两个整数p和q,分别代表每个学生的学号和成绩
//输出:按照学生的成绩从小到大进行排序,并将排序后的学生信息打印出来
//如果学生的成绩相同,那么按照学号的大小从小到大排序
#include <cstdio>
#include <algorithm>
using namespace std;
struct Student {
    int Stu_number;
    int Stu_grade;
};//分号不能省略
bool comp(Student lsh,Student rsh){
    //不发生交换的情况
    if(lsh.Stu_grade < rsh.Stu_grade){
        return true;
    }
    else if(lsh.Stu_grade == rsh.Stu_grade&&lsh.Stu_number <rsh.Stu_number){
        return true;
    }
    else
        return false;
}
int main(){
    Student arr[100];
    int n;
    scanf("%d",&n);
    for(int i=0;i<n;i++){
        scanf("%d%d",&arr[i].Stu_number,&arr[i].Stu_grade);
    }
    sort(arr,arr+n,comp);
    for(int i=0;i<n;++i){
        printf("%d %d\n",arr[i].Stu_number,arr[i].Stu_grade);
    }
}