#include<bits/stdc++.h>
using namespace std;
typedef pair< int, int > Pi;
const int vy[] = {0, 1, 0, -1}, vx[] = {1, 0, -1, 0};
 
 
map< Pi, Pi > futon;
map< Pi, int > head;
 
bool check(const Pi& point)
{
  head[point] = 1;
  head[futon[point]] = -1;
  bool flag = true;
  for(int i = 0; i < 4 && flag; i++) {
    const int nx = point.first + vx[i], ny = point.second + vy[i];
    if(make_pair(nx, ny) == futon[point]) continue;
    if(head.find({nx, ny}) != head.end()) {
      if(head[{nx, ny}] == -1) flag = false;
    } else if(futon.find({nx, ny}) != futon.end()) {
      if(!check({nx, ny})) flag = false;
    }
  }
   
  for(int i = 0; i < 4 && flag; i++) {
    const int nx = futon[point].first + vx[i], ny = futon[point].second + vy[i];
    if(make_pair(nx, ny) == point) continue;
    if(head.find({nx, ny}) != head.end()) {
      if(head[{nx, ny}] == 1) flag = false;
    } else if(futon.find({nx, ny}) != futon.end()) {
      if(!check(futon[{nx, ny}])) flag = false;
    }
  }
  return(flag);
}
 
int main()
{
  int N;
  while(cin >> N, N) {
    while(N--) {
      int x, y;
      char dir;
      cin >> x >> y >> dir;
      if(dir == 'x') {
        futon[{x, y}] = {x + 1, y};
        futon[{x + 1, y}] = {x, y};
      } else {
        futon[{x, y}] = {x, y + 1};
        futon[{x, y + 1}] = {x, y};
      }
    }
    while(!futon.empty()) {
      auto decide = *futon.begin();
      if(head.find(decide.first) == head.end()) {
        if(!check(decide.first)) break;
      }
      futon.erase(futon.begin());
    }
    if(futon.empty()) cout << "Yes" << endl;
    else cout << "No" << endl;
 
    head.clear();
    futon.clear();
  }
}