#include<iostream>
#include<sstream>
#include<algorithm>
#include<set>
#include<map>
#include<queue>
#include<complex>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cassert>

#define rep(i,n) for(int i=0;i<(int)n;i++)
#define all(c) (c).begin(),(c).end()
#define mp make_pair
#define pb push_back
#define each(i,c) for(__typeof((c).begin()) i=(c).begin();i!=(c).end();i++)
#define dbg(x) cerr<<__LINE__<<": "<<#x<<" = "<<(x)<<endl

using namespace std;

typedef long long ll;
typedef vector<int> vi;
typedef pair<int,int> pi;
const int inf = (int)1e9;
const double INF = 1e12, EPS = 1e-9;

const int dy[] = {-1, 0, 1, 0}, dx[] = {0, -1, 0, 1};
int n, dp[40000], st[40000], k;
map<pi, int> id;
vi x, y, d;

bool rec(int cx, int cy, int cd){
	queue<pair<pi, int> > q;
	q.push(mp(mp(cx, cy), cd));
	dp[st[k++] = id[mp(cx, cy)]] = cd;
	
	while(!q.empty()){
		cx = q.front().first.first; cy = q.front().first.second;
		cd = q.front().second;
		q.pop();
		
		rep(d, 4){
			int nx = cx + dx[d], ny = cy + dy[d];
			if(!id.count(mp(nx, ny))) continue;
			int ii = id[mp(nx, ny)];
			int nd = ii == (id[mp(cx, cy)] ^ 1) ? 1 - cd : cd;
			
			if(dp[ii] >= 0 && dp[ii] != nd) return 0;
			if(dp[ii] >= 0) continue;
			dp[st[k++] = ii] = nd;
			q.push(mp(mp(nx, ny), nd));
		}
	}
	return 1;
}

int main(){
	while(scanf("%d", &n), n){
		x.clear(); y.clear(); d.clear();
		id.clear();
		
		rep(i, n){
			int a, b; char c;
			scanf("%d%d %c", &a, &b, &c);
			x.pb(a); y.pb(b); d.pb(c == 'x');
			id[mp(a, b)] = i * 2;
			id[mp(a + d[i], b + 1 - d[i])] = i * 2 + 1;
		}
		memset(dp, -1, sizeof(dp));
		rep(i, 2 * n) if(dp[i] < 0){
			k = 0;
			if(rec(x[i / 2], y[i / 2], 0)) continue;
			while(k) dp[st[--k]] = -1;
			if(!rec(x[i / 2], y[i / 2], 1)){
				cout << "No" << endl;
				goto END;
			}
		}
		cout << "Yes" << endl;
		END:;
	}
	return 0;
}