#include <iostream>
#include <cstring>
#include <vector>
using namespace std;
long n, m;
char str[30];
vector < vector < vector <long> > > V;
long arr[110];
bool vist[110], isCan[110][110];
void solution()
{
if (m == 0)
{
puts("YES");
return;
}
long i, j, k, havekey = 0;
memset(vist, 0, sizeof(vist));
vist[m] = true;
havekey |= arr[m];
bool flag = true;
while (flag)
{
flag = false;
for (i = 0; i < n; ++i)
{
if (vist[i])
{
for (j = 0; j < n; ++j)
{
if (isCan[i][j] && !vist[j])
{
for (k = 0; k < V[i][j].size(); ++k)
{
if ((havekey & V[i][j][k]) == V[i][j][k] && !vist[j])
{
havekey |= arr[j];
vist[j] = true;
flag = true;
if (j == 0)
{
puts("YES");
return;
}
}
}
}
}
}
}
}
puts("NO");
}
int main()
{
long i;
char ch;
while (scanf("%s", str) != EOF)
{
if (!strcmp(str, "ENDOFINPUT"))
{
break;
}
memset(isCan, 0, sizeof(isCan));
memset(arr, 0, sizeof(arr));
scanf("%ld %ld", &m, &n);
V.clear();
V.resize(n);
for (i = 0; i < n; ++i)
{
V[i].resize(n);
}
getchar();
for (i = 0; i < n; ++i)
{
long num = 0, state = 0;
bool flag = false;
while (scanf("%c", &ch))
{
if (ch == ' ' || ch == '\n')
{
if (flag)
{
V[i][num].push_back(state);
V[num][i].push_back(state);
isCan[i][num] = isCan[num][i] = true;
num = state = 0;
flag = false;
}
}
else if (ch >= '0' && ch <= '9')
{
flag = true;
num = num*10+ch-'0';
}
else if (ch >= 'A' && ch <= 'Z')
{
state |= (1<<(ch-'A'));
}
if (ch == '\n')
{
break;
}
}
}
for (i = 0; i < n; ++i)
{
while (scanf("%c", &ch))
{
if (ch >= 'A' && ch <= 'Z')
{
arr[i] |= (1<<(ch-'A'));
}
if (ch == '\n')
{
break;
}
}
}
gets(str);
solution();
}
return 0;
}