#include <cstdio>
#include <iostream>
#include <sstream>
#include <fstream>
#include <iomanip>
#include <algorithm>
#include <cmath>
#include <string>
#include <vector>
#include <list>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <bitset>
#include <numeric>
#include <climits>
#include <cfloat>
using namespace std;

int dy[] = {1, 0, -1, 0};
int dx[] = {0, -1, 0, 1};

vector<vector<int> > edges;
vector<int> memo;

bool solve(int curr)
{
    for(unsigned i=0; i<edges[curr].size(); ++i){
        int next = edges[curr][i];
        int x = memo[curr];
        if(i == 0)
            x ^= 1;

        if(memo[next] == -1){
            memo[next] = x;
            if(!solve(next))
                return false;
        }else if(memo[next] != x){
            return false;
        }
    }
    return true;
}

int main()
{
    for(;;){
        int n;
        cin >> n;
        if(n == 0)
            return 0;

        map<pair<int, int>, int> index;
        edges.assign(2*n, vector<int>(0));
        for(int i=0; i<n; ++i){
            int y1, x1, y2, x2;
            char dir;
            cin >> x1 >> y1 >> dir;
            y2 = y1;
            x2 = x1;
            if(dir == 'x')
                ++ x2;
            else
                ++ y2;

            edges[2*i].push_back(2*i+1);
            edges[2*i+1].push_back(2*i);

            for(int j=0; j<4; ++j){
                map<pair<int, int>, int>::iterator it1 = index.find(make_pair(y1+dy[j], x1+dx[j]));
                if(it1 != index.end()){
                    edges[2*i].push_back(it1->second);
                    edges[it1->second].push_back(2*i);
                }
                map<pair<int, int>, int>::iterator it2 = index.find(make_pair(y2+dy[j], x2+dx[j]));
                if(it2 != index.end()){
                    edges[2*i+1].push_back(it2->second);
                    edges[it2->second].push_back(2*i+1);
                }
            }

            index[make_pair(y1, x1)] = 2 * i;
            index[make_pair(y2, x2)] = 2*i+1;
        }

        memo.assign(2*n, -1);
        bool ok = true;
        for(int i=0; i<2*n; ++i){
            if(memo[i] != -1)
                continue;

            memo[i] = 0;
            if(!solve(i)){
                ok = false;
                break;
            }
        }

        if(ok)
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
}