#include <stdio.h>

struct current_location {
	int x;
	int y;
};

void init(int [][21], struct current_location *, int *);
int  move(int [][21], struct current_location *);

int main(void) 
{
	int M, N;
	int x, y;
	int i;
	int field[21][21];
	int collected_gems = 0;
	struct current_location current = {10, 10};

	while (scanf("%d", &N), N) {
		init(field, &current, &collected_gems);

		for (i = 0; i < N; i++) {
			scanf("%d %d", &x, &y);
			field[x][y] = 1;
		}

		if (field[current.x][current.y]) {
			collected_gems++;
			field[current.x][current.y]--;
		}

		scanf("%d", &M);

		for (i = 0; i < M; i++) {
			collected_gems += move(field, &current);
		}

		if (collected_gems == N) 
			printf("YES\n");
		else 
			printf("NO\n");
	}
	return 0;
}

void init(int field[][21], struct current_location *current, int *collected_gems) 
{
	int i, j;

	for (i = 0; i < 21; i++) 
		for (j = 0; j < 21; j++) 
			field[i][j] = 0;

	current->x = current->y = 10;
	*collected_gems         = 0;
}

int move(int field[][21], struct current_location *current) 
{
	char direction;
	int  distance, collected_gems = 0;
	int  i;

	scanf(" %c %d", &direction, &distance);

	switch (direction) {
	case 'N':
		for (i = 0; i < distance; i++) {
			current->y++;
			if (field[current->x][current->y]) {
				collected_gems++;
				field[current->x][current->y]--;
			}
		}		
		break;
	case 'E':
		for (i = 0; i < distance; i++) {
			current->x++;
			if (field[current->x][current->y]) {
				collected_gems++;
				field[current->x][current->y]--;
			}
		}		
		break;
	case 'W':
		for (i = 0; i < distance; i++) {
			current->x--;
			if (field[current->x][current->y]) {
				collected_gems++;
				field[current->x][current->y]--;
			}
		}		
		break;
	case 'S':
		for (i = 0; i < distance; i++) {
			current->y--;
			if (field[current->x][current->y]) {
				collected_gems++;
				field[current->x][current->y]--;
			}
		}		
		break;
	}
	return collected_gems;
}