#include <set>
#include <map>
#include <iostream>
#include <cstdio>
#include <queue>
#define REP(i,n) for(int i=0; i<(int)(n); i++)
/*
  3344
  1122

 */

const int _dx[] = {0,1,0,-1};
const int _dy[] = {-1,0,1,0};

using namespace std;

map<pair<int, int>, int>  memo;
vector<vector<pair<int, int> > > futon;
vector<bool> decide;
vector<vector<int> > foot;

bool dfs(int i){
  REP(j,2){
    int x = futon[i][j].first;
    int y = futon[i][j].second;
    
    REP(k,4){
      int xx = x + _dx[k];
      int yy = y + _dy[k];
      pair<int, int> p = make_pair(xx, yy);
      
      if(memo.count(p) && memo[p] != i){
	int adj = memo[p];
	if(!decide[adj]){
	  decide[adj] = true;
	  if(xx == futon[adj][0].first && yy == futon[adj][0].second){
	    foot[adj][0] = foot[i][j];
	    foot[adj][1] = foot[i][j] ^ 1;
	  }else{
	    foot[adj][0] = foot[i][j] ^ 1;
	    foot[adj][1] = foot[i][j];
	  }
	  if(!dfs(adj)) return false;
	}else{
	  if(xx == futon[adj][0].first && yy == futon[adj][0].second){
	    if(foot[adj][0] != foot[i][j]) return false;
	  }else{
	    if(foot[adj][1] != foot[i][j]) return false;
	  }
	}
      }
    }
  }
  return true;
}

int main(){
  int n;
  while(scanf("%d", &n), n){
    memo.clear();
    futon  = vector<vector<pair<int, int> > >(n, vector<pair<int, int> >(2));
    decide = vector<bool>(n, false);
    foot   = vector<vector<int> >(n, vector<int>(2));

    REP(i,n){
      int x, y;
      char dir[2];

      scanf("%d%d%s", &x, &y, dir);

      futon[i][0] = make_pair(x, y);
      if(dir[0] == 'x'){
	futon[i][1] = make_pair(x + 1, y);
      }else{
	futon[i][1] = make_pair(x, y + 1);
      }
      memo[futon[i][1]] = memo[futon[i][0]] = i;
    }

    bool ok = true;

    REP(i,n) if(!decide[i]){
      decide[i] = true;
      foot[i][0] = 1; foot[i][1] = 0;
      if(!dfs(i)){
	ok = false;
	break;
      }
      // printf("%d: ok\n", i);
    }
    puts(ok ? "Yes" : "No");
  }
  return 0;
}