/*
题意:在一段区间内涂颜色,问最后每种颜色有多少个区间
1、0-2和3-4这两个区间不是重合的,2-3也是一段区间,所以update的时候是从L+1~R 这个区间更新
2、pushdown之后一定要清空标记,不然后面再次pushdown会受到影响
*/
#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cmath>
#include<cstdlib>
#include<cstring>
#include<string>
#include<map>
#include<vector>
#include<set>
#include<queue>
using namespace std;
#define ll long long
int tree[32005],nn[8005],pre;
int cas=1;
void pushdown(int num)
{
if(tree[num]!=-1)
{
tree[num*2]=tree[num*2+1]=tree[num];
tree[num]=-1;//这里一定要清空标记,不然下次pushdown会受到影响
}
}
void update(int L, int R,int v,int left,int right,int num)
{//cout<<left<<" "<<right<<endl;
if(left>=L&&R>=right)
{//cout<<left<<" left "<<right<<" "<<v<<endl;
tree[num]=v;
return;
}
pushdown(num);
int mid=(left+right)/2;
if(L<=mid)update(L,R,v,left,mid,2*num);
if(R>mid)update(L,R,v,mid+1,right,2*num+1);
}
void query(int L,int R,int num)
{
if(L==R)
{
if(tree[num]!=-1)
// cout<<"L tree "<<tree[num]<<" "<<L<<endl;
if(tree[num]!=-1&&tree[num]!=pre)nn[tree[num]]++;
pre=tree[num];
return;
}
pushdown(num);
int mid=(L+R)/2;
query(L,mid,num*2);
query(mid+1,R,num*2+1);
}
int main()
{
std::ios::sync_with_stdio(false);
int n,i,r,c,l;
while(~scanf("%d",&n))
{
memset(nn,0,sizeof(nn));
memset(tree,-1,sizeof(tree));
for(i=0;i<n;i++)
{
scanf("%d %d %d",&l,&r,&c);
update(l+1,r,c,1,8000,1);
}
pre=-1;
query(1,8000,1);
// if(cas!=1)printf("\n");
// cas++;
for(i=0;i<=8000;i++)
{
if(nn[i])printf("%d %d\n",i,nn[i]);
}
printf("\n");
}
return 0;
}