#include <bits/stdc++.h>
using namespace std;
using ll = long long;
using PII = pair<ll, ll>;
#define FOR(i, a, n) for (ll i = (ll)a; i < (ll)n; ++i)
#define REP(i, n) FOR(i, 0, n)
#define ALL(x) x.begin(), x.end()
template<typename T> void chmin(T &a, const T &b) { a = min(a, b); }
template<typename T> void chmax(T &a, const T &b) { a = max(a, b); }
struct FastIO {FastIO() { cin.tie(0); ios::sync_with_stdio(0); }}fastiofastio;
#ifdef DEBUG_ 
#include "../program_contest_library/memo/dump.hpp"
#else
#define dump(...)
#endif
const ll INF = 1LL<<60;

int main(void) {
    while(1) {
        ll n;
        cin >> n;
        if(!n) break;
        ll idx = 0;
        map<PII,ll> mp;
        REP(i, n) {
            ll x, y;
            char c;
            cin >> x >> y >> c;

            if(c == 'x') {
                if(mp.find({x,y}) == mp.end()) mp[{x, y}] = idx++;
                if(mp.find({x+1,y}) == mp.end()) mp[{x+1, y}] = idx++;
            }
            else {
                if(mp.find({x,y}) == mp.end()) mp[{x, y}] = idx++;
                if(mp.find({x,y+1}) == mp.end()) mp[{x, y+1}] = idx++;            
            }
        }

        dump(mp);

        vector<vector<ll>> g(idx);
        auto add_edge = [&](ll a, ll b) {
            g[a].push_back(b);
        };

        ll dx[] = {0, -1, 0, 1}, dy[] = {-1, 0, 1, 0};
        for(auto p: mp) {
            PII pt = p.first;
            REP(i, 4) {
                ll nx = pt.first + dx[i], ny = pt.second + dy[i];
                if(mp.find({nx,ny}) == mp.end()) continue;
                add_edge(p.second, mp[{nx, ny}]);
            }
        }

        dump(g);

        vector<ll> val(idx);
        function<void(ll,ll)> dfs = [&](ll v, ll c) {
            val[v] = c;
            for(auto to: g[v]) {
                if(val[to] != -1) continue;
                ll nc = c;
                if(v%2 && to==v-1) nc = 1-c;
                else if(to%2 && v==to-1) nc = 1-c;
                dfs(to, nc);
            }
        };

        auto check = [&] {
            bool ret = true;
            REP(i, idx) {
                for(auto to: g[i]) {
                    if((i%2 && to==i-1) || (to%2 && i==to-1)) {
                        if(val[i] == val[to]) ret = false;
                    } else {
                        if(val[i] != val[to]) ret = false;
                    }
                }
            }
            return ret;
        };

        val.assign(idx, -1);
        REP(i, idx) if(val[i] == -1) dfs(i, 0);
        dump(val);
        if(check()) {
            cout << "Yes" << endl;
            continue;
        }

        cout << "No" << endl;
    }

    return 0;
}
