#include<bits/stdc++.h>
using namespace std;
struct Tabel { //用来存储每个平台信息的struct
int id, H, L, R; //id时编号,H, L, R分别为高度、左端点、右端点
int ansL, ansR; //用来存储答案,分别为左端点第一个触碰到的、
//右端点第一个触碰到的
};
inline bool pd(Tabel a, Tabel b) { //在sort排序时使用的pd函数
if (a.H == b.H) { //假如高度相同(重复的)就使用编号排序
if(a.id > b.id) {
return false;
} else {
return true;
}
}
return a.H > b.H; //当高度不相同时,采用高度排序
}
inline bool pd2(Tabel a, Tabel b) { //用于排序的pd2函数
if(a.id > b.id) { //按照id排序
return false;
}
return true;
}
int main(int argc, char** args) {
int n = 0;
struct Tabel t[1005];
memset(t, 0, sizeof(t)); //将t全部初始化为0
scanf("%d", &n);
for(int i = 0;i < n;i++) {
scanf("%d %d %d", &t[i].H, &t[i].L, &t[i].R);
t[i].id = i + 1; //设置每一个平台的id,因为是从1开始的,所以加一
}
sort(t, t + n, pd); //按照高度或id排序
for(int i = 0;i < n;i++) { //判断左端点的触碰,求出答案之一
t[i].ansL = 0;
for(int j = i;j < n;j++) {
if(t[i].L > t[j].L && t[i].L < t[j].R) { //当左端点在某个平台内时(不包括两端)
t[i].ansL = t[j].id; //记录触碰平台的id
break; //这里只求第一个触碰到的,所以break
}
}
}
for(int i = 0;i < n;i++) { //判断右端点的触碰,求出答案,以下同上
t[i].ansR = 0;
for(int j = i;j < n;j++) {
if(t[i].R < t[j].R && t[i].R > t[j].L) {
t[i].ansR = t[j].id;
break;
}
}
}
//这里将序列恢复成原来的样子是应为要按照id的顺序输出
sort(t, t + n, pd2); //最终将序列恢复成原来的样子
for(int i = 0;i < n;i++) {
printf("%d %d\n", t[i].ansL, t[i].ansR); //输出
}
}