#include <iostream>
#include <fstream>
#include <cstdio>
#include <cmath>
#include <vector>
#include <cstring>
#include <string>
#include <set>
#include <map>
#include <stack>
#include <queue>
#include <algorithm>
#include <cctype>
using namespace std;
 
#define REP(i,n) for(int i=0; i<n; ++i)
#define FOR(i,a,b) for(int i=a; i<=b; ++i)
#define FORR(i,a,b) for (int i=a; i>=b; --i)
 
typedef long long ll;
typedef vector<int> VI;
typedef vector<ll> VL;
typedef vector<VI> VVI;
typedef pair<int,int> P;
typedef pair<ll,ll> PL;
typedef string::const_iterator State;

map<P, int> f, a;
VI check, x, y, d;
bool pos;
int dx[] = {-1,1,0,0}, dy[] = {0,0,1,-1};

void dfs(int id, int xc, int yc, int c){
    if (check[id]) return;
    check[id] = 1;
    int x1, x2, y1, y2;
    x1 = x[id], y1 = y[id];
    if (d[id] == 0) x2 = x1 + 1, y2 = y1;
    else x2 = x1, y2 = y1 + 1;
    if (x1 == xc && y1 == yc){
        a[P(x1,y1)] = c;
        a[P(x2,y2)] = c^1;
        REP(k,4){
            int xx = x1 + dx[k], yy = y1 + dy[k];
            if (xx == x2 && yy == y2) continue;
            if (f[P(xx,yy)] == 0) continue;
            int id_next = f[P(xx,yy)] - 1;
            if (check[id_next] && a[P(xx,yy)] != c) pos = false;
            dfs(id_next, xx, yy, c);
        }
        REP(k,4){
            int xx = x2 + dx[k], yy = y2 + dy[k];
            if (xx == x1 && yy == y1) continue;
            if (f[P(xx,yy)] == 0) continue;
            int id_next = f[P(xx,yy)] - 1;
            if (check[id_next] && a[P(xx,yy)] == c) pos = false;
            dfs(id_next, xx, yy, c^1);
        }
    }
    if (x2 == xc && y2 == yc){
        a[P(x2,y2)] = c;
        a[P(x1,y1)] = c^1;
        REP(k,4){
            int xx = x2 + dx[k], yy = y2 + dy[k];
            if (xx == x1 && yy == y1) continue;
            if (f[P(xx,yy)] == 0) continue;
            int id_next = f[P(xx,yy)] - 1;
            if (check[id_next] && a[P(xx,yy)] != c) pos = false;
            dfs(id_next, xx, yy, c);
        }
        REP(k,4){
            int xx = x1 + dx[k], yy = y1 + dy[k];
            if (xx == x2 && yy == y2) continue;
            if (f[P(xx,yy)] == 0) continue;
            int id_next = f[P(xx,yy)] - 1;
            if (check[id_next] && a[P(xx,yy)] == c) pos = false;
            dfs(id_next, xx, yy, c^1);
        }
    }
}

int main() {
    int n;
    while (cin >> n && n){
        pos = true;
        f.clear();
        a.clear();
        check.clear();
        check.resize(n);
        x.resize(n);
        y.resize(n);
        d.resize(n);
        REP(i,n){
            char c;
            cin >> x[i] >> y[i] >> c;
            f[P(x[i], y[i])] = i+1;
            if (c == 'x') f[P(x[i]+1, y[i])] = i+1, d[i] = 0;
            else f[P(x[i], y[i]+1)] = i+1, d[i] = 1;
        }
        REP(i,n){
            if (!check[i]) dfs(i, x[i], y[i], 1);
            // REP(j,n) cout << check[j];
            // cout << endl;
        }

        // REP(i,4){
        //     REP(j,4){
        //         cout << f[P(i,j)];
        //     }
        //     cout << endl;
        // }
        // cout << endl;
        // REP(i,4){
        //     REP(j,4){
        //         cout << a[P(i,j)];
        //     }
        //     cout << endl;
        // }

        cout << (pos ? "Yes" : "No") << endl;
    }

    return 0;
}

Measured memory_bytes: 17916