#include<iostream>
#define ls(x) (x << 1)
#define rs(x) ((x << 1) | 1)
using namespace std;
const int maxn = 10010;
struct Node{
int l, r;
int max, lazy;
}node[maxn * 4];
void build(int num, int l, int r){
node[num].l = l; node[num].r = r;
node[num].max = node[num].lazy = 0;
if(l == r) return;
int m = (l + r) >> 1;
build(ls(num), l, m);
build(rs(num), m + 1, r);
}
void add(int num, int l, int r, int v){
node[num].max = max(node[num].max, v);
if(l <= node[num].l && node[num].r <= r){
node[num].lazy = max(node[num].lazy, v);
return;
}
if(node[num].lazy){
node[ls(num)].max = max(node[ls(num)].max, node[num].lazy);
node[ls(num)].lazy = max(node[ls(num)].lazy, node[num].lazy);
node[rs(num)].max = max(node[rs(num)].max, node[num].lazy);
node[rs(num)].lazy = max(node[rs(num)].lazy, node[num].lazy);
node[num].lazy = 0;
}
if(l <= node[ls(num)].r) add(ls(num), l, r, v);
if(r >= node[rs(num)].l) add(rs(num), l, r, v);
}
int query(int num, int a){
if(node[num].l == node[num].r) return node[num].max;
node[ls(num)].max = max(node[ls(num)].max, node[num].lazy);
node[rs(num)].max = max(node[rs(num)].max, node[num].lazy);
node[num].lazy = 0;
int ans = 0;
if(a <= node[ls(num)].r) ans = max(ans, query(ls(num), a));
if(a >= node[rs(num)].l) ans = max(ans, query(rs(num), a));
return ans;
}
int main(){
build(1, 1, 16384);
int a, b, c;
int _l = 16384, _r = 0;
while(cin >> a >> b >> c){
if(a == -1) break;
add(1, a, c, b);
_l = min(_l, a);
_r = max(_r, c);
}
int y = query(1, _l);
cout << _l << " " << y << " ";
for(int i = _l + 1; i <= _r + 1; i++){
int temp = query(1, i);
if(temp != y){
y = temp;
cout << i << " " << y << " ";
}
}
}