#include <iostream>
#include <map>
#include <algorithm>
using namespace std;

typedef pair<int,int> P;
const int MAX_N = 20001;
const int dx[4] = {0,0,-1,1};
const int dy[4] = {-1,1,0,0};

// input
int n, x[MAX_N], y[MAX_N];
char dir[MAX_N];

int futon[MAX_N];
bool used[MAX_N];
map<P,int> m;
bool ans;

void dfs(int pos, int k){
	if( !ans ) return ;
	
	int x1 = x[pos], y1 = y[pos], x2, y2;
	used[pos] = true;
	futon[pos] = k;
	int next = (k + 1) % 2;
	if( dir[pos] == 'x' ){
		x2 = x1 + 1, y2 = y1;
	}else{
		x2 = x1, y2 = y1 + 1;
	}
	
	for(int i=0 ; i < 4 ; i++ ){
		int mx = x1 + dx[i], my = y1 + dy[i];
		if( mx == x2 && my == y2 ) continue;
		
		if( m.count(P(mx, my)) ){
			int id = m[P(mx, my)];
			if( used[id] ){
				if( futon[id] == futon[pos] ){
					ans = false;
				}
			}else{
				dfs(id, next);
			}
		}
	}
	for(int i=0 ; i < 4 ; i++ ){
		int mx = x2 + dx[i], my = y2 + dy[i];
		if( mx == x1 && my == y1 ) continue;
		
		if( m.count(P(mx, my)) ){
			int id = m[P(mx, my)];
			if( used[id] ){
				if( futon[id] == futon[pos] ){
					ans = false;
				}
			}else{
				dfs(id, next);
			}
		}
	}
}

int main(){
	while( cin >> n , n ){
		// initialize 
		fill(used, used + MAX_N, false);
		fill(futon, futon + MAX_N, -1);
		m.clear();
		ans = true;
		
		for(int i=0 ; i < n ; i++ ){
			cin >> x[i] >> y[i] >> dir[i];
			m[P(x[i], y[i])] = i;
			if( dir[i] == 'x' ) m[P(x[i] + 1, y[i])] = i;
			if( dir[i] == 'y' ) m[P(x[i] , y[i] + 1)] = i;
		}
		
		for(int i=0 ; i < n ; i++ ){
			if( used[i] ) continue;
			dfs(i, 0);
		}
		cout << (ans? "Yes" : "No") << endl;
	}
}