#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
using namespace std;
struct Nodes{
	int l,r,p;
	int key1,key2;
	int id;
}tree[50010],a[50010];
int size=-1,root=-1;
bool cmp(Nodes aa,Nodes bb)
{
	return aa.key1<bb.key1;
}
void insert(Nodes num)
{
	int pre=size;
	int cur=++size;
	int k;
	tree[cur]=num;
	tree[cur].l=tree[cur].r=-1;
	tree[cur].p=pre;
	k=pre;
	while(k!=-1&&tree[k].key2>tree[cur].key2){
		k=tree[k].p;
	}
	if(k!=-1){
		tree[cur].l=tree[k].r;
		if(tree[k].r!=-1){
			tree[tree[k].r].p=cur;
		}
		tree[k].r=cur;
		tree[cur].p=k;
	}else{
		tree[cur].l=root;
		if(root!=-1){
			tree[root].p=cur;
		}
		root=cur;
		tree[cur].p=-1;
	}
}
int main()
{
	int i,j,n;
	while(scanf("%d",&n)!=EOF){
		for(i=0;i<n;i++){
			scanf("%d%d",&a[i].key1,&a[i].key2);
			a[i].id=i;
		}
		sort(a,a+n,cmp);
		for(i=0;i<n;i++){
			insert(a[i]);
		}
		for(i=0;i<n;i++){
			j=tree[i].id;
			if(tree[i].p!=-1){
				a[j].p=tree[tree[i].p].id;
			}else a[j].p=-1;
			if(tree[i].l!=-1){
				a[j].l=tree[tree[i].l].id;
			}else a[j].l=-1;
			if(tree[i].r!=-1){
				a[j].r=tree[tree[i].r].id;
			}else a[j].r=-1;
		}
		printf("YES\n");
		for(i=0;i<n;i++)
			printf("%d %d %d\n",a[i].p+1,a[i].l+1,a[i].r+1);
	}
	return 0;
}
