#include<bits/stdc++.h>
#define f first
#define s second
#define mp make_pair
using namespace std;

int X[4]={-1,0,1,0};
int Y[4]={0,1,0,-1};

int main()
{
  int n,x1[20001],x2[20001],y1[20001],y2[20001];
  char c;

  while(1){
    cin>>n;
    if(n==0)break;
    map<pair<int,int>,int> index;
    map<pair<int,int>,int> m;
    for(int i=0;i<n;i++){
      cin>>x1[i]>>y1[i]>>c;
      index[mp(x1[i],y1[i])]=i;
      if(c=='x'){
	x2[i]=x1[i]+1;
	y2[i]=y1[i];
      }
      else {
 	x2[i]=x1[i];
	y2[i]=y1[i]+1;
      }
      index[mp(x2[i],y2[i])]=i;
    }

    string ans="Yes";
    bool checked[20001]={};

    for(int i=0;i<n;i++){

      if(checked[i])continue;
      checked[i]=true;

      m[mp(x1[i],y1[i])]=1;
      m[mp(x2[i],y2[i])]=0;

      queue<int> q;
      q.push(i);
      while(!q.empty()){
	int u=q.front();
	q.pop();

	for(int k=0;k<4;k++){
	  pair<int,int> npii(x1[u]+X[k],y1[u]+Y[k]);
	  if(index.find(npii)==index.end())continue;
	  int next=index[npii];
	  if(next==u)continue;
	  if(m.find(npii)==m.end()){
	    m[npii]=m[mp(x1[u],y1[u])];
	    if(m.find(mp(x1[next],y1[next]))==m.end())
	      m[mp(x1[next],y1[next])]=(m[mp(x1[u],y1[u])]+1)%2;
	    else  m[mp(x2[next],y2[next])]=(m[mp(x1[u],y1[u])]+1)%2;
	    q.push(next);
	  }
	  else {
	    if(m[npii]!=m[mp(x1[u],y1[u])])ans="No";
	  }
	}
	for(int k=0;k<4;k++){
	  pair<int,int> npii(x2[u]+X[k],y2[u]+Y[k]);
	  if(index.find(npii)==index.end())continue;
	  int next=index[npii];
	  if(next==u)continue;
	  if(m.find(npii)==m.end()){
	    m[npii]=m[mp(x2[u],y2[u])];
	    if(m.find(mp(x1[next],y1[next]))==m.end())
	      m[mp(x1[next],y1[next])]=(m[mp(x2[u],y2[u])]+1)%2;
	    else  m[mp(x2[next],y2[next])]=(m[mp(x2[u],y2[u])]+1)%2;
	    q.push(next);
	  }
	  else {
	    if(m[npii]!=m[mp(x2[u],y2[u])])ans="No";
	  }
	}
	checked[u]=true;
      }
    }
    cout<<ans<<endl;
  }
  return 0;
}