#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define MAX 1000000000
#define N 10010
#define M 5010
#define lch(i) ((i)<<1)
#define rch(i) ((i)<<1|1)
#define min(a,b) a<b?a:b
#define max(a,b) a>b?a:b
struct point{
int m,f,n;
}p[N];
struct segment{
int l,r,v;
}s[M];
struct tree{
int l,r,cnt;
int mid()
{ return (l+r)>>1; }
}t[4*N];
int m,num;
struct ran{
int l,r;
}c[N];
int nc;
int cmp(struct point a ,struct point b)
{
return a.n<b.n;
}
void build(int l ,int r ,int rt)
{
t[rt].l=l; t[rt].r=r; t[rt].cnt=0;
if(l+1==r) return ;
int mid=t[rt].mid();
build(l,mid,lch(rt));
build(mid,r,rch(rt));
}
void updata(int l ,int r ,int v ,int rt)
{
if(t[rt].cnt == v) return ; //剪枝
if(t[rt].l == l && t[rt].r == r)
{
t[rt].cnt=v;
return ;
}
if(t[rt].cnt!=-1) //当前节点是纯色的,传递给它的孩子并且记录其为不纯色的
{
t[lch(rt)].cnt=t[rch(rt)].cnt=t[rt].cnt;
t[rt].cnt=-1;
}
int mid=t[rt].mid();
if(r<=mid)
updata(l,r,v,lch(rt));
else if(l>=mid)
updata(l,r,v,rch(rt));
else
{
updata(l,mid,v,lch(rt));
updata(mid,r,v,rch(rt));
}
}
void query(int rt)
{
if(t[rt].cnt==1) //该区间全部是黑色的没必要再继续下去
return ;
if(t[rt].cnt==0) //该区间全部是白色的没必要继续下去,直接记录
{
c[nc].l=t[rt].l-1;
c[nc].r=t[rt].r-1;
nc++;
return ;
}
if(t[rt].l+1==t[rt].r) return ;
//剩下的情况就是为-1的情况无法确定的
query(lch(rt));
query(rch(rt));
}
void solve()
{
build(1,num,1);
for(int i=0; i<m; i++)
updata(s[i].l , s[i].r , s[i].v , 1);
nc=0;
query(1); //统计出所有白色的线段
// for(int i=0; i<nc; i++) printf("[%d,%d]\n",c[i].l,c[i].r);
int maxlen=-1;
int len;
int resl,resr;
int l,r;
l=c[0].l; r=c[0].r;
for(int i=0; i<nc-1; i++)
{
if(c[i+1].l == c[i].r) //可以继续合并一个区间
r=c[i+1].r;
else //第i+1个区间不能合并进来
{
len= p[r].n - p[l].n;
if(len>maxlen)
{
maxlen=len;
resl=l;
resr=r;
}
l=c[i+1].l;
r=c[i+1].r;
}
}
len= p[r].n - p[l].n;
if(len>maxlen)
{ resl=l; resr=r; }
printf("%d %d\n",p[resl].n , p[resr].n);
}
int main()
{
while(scanf("%d",&m)!=EOF)
{
m++;
s[0].v=0;
p[0].f=0; p[0].m=0; p[0].n=0;
p[1].f=1; p[1].m=0; p[1].n=MAX;
int n=2;
for(int i=1; i<m; i++)
{
int l,r; char col[5];
scanf("%d%d%s",&l,&r,col);
s[i].v= (col[0]=='b')?1:0;
p[n].m=i; p[n].f=0; p[n].n=l;
p[n+1].m=i; p[n+1].f=1; p[n+1].n=r;
n+=2;
}
sort(p,p+n,cmp);
num=0;
for(int i=0; i<n; i++)
{
int mm=p[i].m;
if(i==0 || p[i].n!=p[i-1].n) p[num++]=p[i];
if(p[i].f) s[mm].r=num;
else s[mm].l=num;
}
// for(int i=0; i<num; i++) printf("%d ",p[i].n); printf("\n");
// for(int i=0; i<m; i++) printf("[%d,%d] %d\n",s[i].l,s[i].r,s[i].v);
solve();
}
return 0;
}