#include <bits/stdc++.h>
using namespace std;
template <typename T1, typename T2>
void ckmin(T1 &a, T2 b) {
  if (a > b) a = b;
}
template <typename T1, typename T2>
void ckmax(T1 &a, T2 b) {
  if (a < b) a = b;
}
inline int read() {
  int x = 0, f = 0;
  char ch = getchar();
  while (!isdigit(ch)) f |= ch == '-', ch = getchar();
  while (isdigit(ch)) x = 10 * x + ch - '0', ch = getchar();
  return f ? -x : x;
}
template <typename T>
void print(T x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10) print(x / 10);
  putchar(x % 10 + '0');
}
template <typename T>
void print(T x, char let) {
  print(x), putchar(let);
}
const int N = 205;
const unsigned long long inf = 9223372036854775808ull;
vector<int> adj[N];
pair<int, int> to[N];
int a[N][N], id[N][N], tag[N];
int G, n, m, tot;
int ch[N][2], fail[N], End[N], AC_tot;
void ins() {
  int l = read(), rt = 0;
  for (int i = 1; i <= l; i++) {
    int &son = ch[rt][read()];
    if (!son) son = ++AC_tot;
    rt = son;
  }
  End[rt] = 1;
}
void build_fail() {
  queue<int> q;
  for (int i = 0; i <= 1; i++)
    if (ch[0][i]) q.push(ch[0][i]);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    End[u] |= End[fail[u]];
    for (int i = 0; i <= 1; i++) {
      if (ch[u][i]) {
        fail[ch[u][i]] = ch[fail[u]][i];
        q.push(ch[u][i]);
      } else {
        ch[u][i] = ch[fail[u]][i];
      }
    }
  }
}
struct node {
  int a, b, c;
  unsigned long long dis;
  friend bool operator<(const node &x, const node &y) { return x.dis > y.dis; }
};
priority_queue<node> pq;
unsigned long long dis[N][N][N];
bool vis[N][N][N];
void dijkstra() {
  for (int i = 0; i <= tot; i++)
    for (int j = 0; j <= AC_tot; j++)
      for (int k = 0; k <= AC_tot; k++) dis[i][j][k] = inf;
  for (int i = 0; i <= AC_tot; i++) {
    if (End[i]) continue;
    int son = ch[i][0];
    if (!End[son]) dis[0][i][son] = 1, pq.push({0, i, son, 1});
    son = ch[i][1];
    if (!End[son]) dis[1][i][son] = 1, pq.push({1, i, son, 1});
  }
  while (!pq.empty()) {
    node it = pq.top();
    pq.pop();
    int a = it.a, b = it.b, c = it.c;
    if (vis[a][b][c]) continue;
    vis[a][b][c] = 1;
    if (a < G) {
      for (auto u : adj[a]) {
        if (tag[u] & 1) {
          if (dis[u][b][c] > dis[a][b][c]) {
            dis[u][b][c] = dis[a][b][c];
            pq.push({u, b, c, dis[u][b][c]});
          }
        } else {
          for (int d = 0; d <= AC_tot; d++) {
            if (dis[u][d][c] > dis[u - 1][d][b] + dis[a][b][c]) {
              dis[u][d][c] = dis[u - 1][d][b] + dis[a][b][c];
              pq.push({u, d, c, dis[u][d][c]});
            }
          }
        }
      }
    } else if (tag[a] & 2) {
      int from = ::a[to[a].first][0];
      if (dis[from][b][c] > dis[a][b][c]) {
        dis[from][b][c] = dis[a][b][c];
        pq.push({from, b, c, dis[from][b][c]});
      }
    } else {
      int nxt = ::a[to[a].first][to[a].second + 1];
      for (int d = 0; d <= AC_tot; d++) {
        if (dis[a + 1][b][d] > dis[a][b][c] + dis[nxt][c][d]) {
          dis[a + 1][b][d] = dis[a][b][c] + dis[nxt][c][d];
          pq.push({a + 1, b, d, dis[a + 1][b][d]});
        }
      }
    }
  }
}
int main() {
  G = read(), n = read(), m = read(), tot = G - 1;
  for (int i = 1; i <= n; i++) {
    a[i][0] = read();
    int k = read();
    for (int j = 1; j <= k; j++) {
      a[i][j] = read(), id[i][j] = ++tot, to[tot] = make_pair(i, j);
      adj[a[i][j]].push_back(tot);
      if (j == 1) tag[tot] |= 1;
      if (j == k) tag[tot] |= 2;
    }
  }
  for (int i = 1; i <= m; i++) ins();
  build_fail();
  dijkstra();
  for (int i = 2; i <= G - 1; i++) {
    unsigned long long ans = inf;
    for (int b = 0; b <= AC_tot; b++) {
      for (int c = 0; c <= AC_tot; c++) {
        ckmin(ans, dis[i][b][c]);
      }
    }
    if (ans == inf)
      puts("YES");
    else
      printf("NO %llu\n", ans);
  }
  return 0;
}
