#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace __gnu_pbds;
using namespace std;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;
#define int ll
#define ll long long
#define ld long double
#define Euler ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define test ll t; cin>>t; while(t--)
#define all(x) x.begin(), x.end()
#define rall(x) x.rbegin(), x.rend()
#define ys cout<<"YES"<<endl
#define no cout<<"NO"<<endl
#define endl "\n"
#define rv(x) return void(x)
ll gcd(ll a, ll b) { return a ? gcd(b % a, a) : b;}
ll lcm(ll a, ll b) { return (abs ((a*b))/ gcd(a,b));}
bool compare(const pair<int, int>&i, const pair<int, int>&j){return (i.first == j.first)? i.second > j.second: i.first < j.first;}
bool comp (const pair<int,pair<int,int>>&i,const pair<int,pair<int,int>>&j){return i.second.first<j.second.first;}
bool pairs(const pair<int,int>&i,const pair<int,int>&j){return i.second>j.second;}
//int dx[] = { 0, 0, 1, -1};
//int dy[] = { -1, 1, 0, 0 };
//int Dx[] = { -1, -1, -1, 0, 0, 1, 1, 1 };
//int Dy[] = { -1, 0, 1, -1, 1, -1, 0, 1 };
//const int MOD = 1000000007;
void sol(){
    int n;
    cin>>n;
    vector<pair<int,int>>v(n);
    for (int i = 0; i < n; ++i) {
        cin>>v[i].first>>v[i].second;
    }
    sort(v.begin(),v.end(),[&](const pair<int,int>&i,const pair<int,int>&j){
        return i.second>j.second;
    });
    for (int i = 0; i < n; ++i) {
        cout<<v[i].first<<" "<<v[i].second<<endl;
    }
}
signed main() {
    Euler
//     freopen("breedflip.in", "r", stdin);
//     freopen("breedflip.out", "w", stdout);
//    test
    sol();
    return 0;
}