#include <bits/stdc++.h>
using namespace std;
int read() {
  int x = 0, f = 1;
  char a = getchar();
  for (; !isdigit(a); a = getchar())
    if (a == '-') f = -1;
  for (; isdigit(a); a = getchar()) x = x * 10 + a - '0';
  return x * f;
}
const unsigned long long INF = 1ULL << 63;
const int N = 200 + 5;
const int M = 50 + 5;
int IG, IN, IM, n, ipt[N];
int issuf[N];
int vis[N][M][M];
unsigned long long f[N][M][M];
vector<pair<int, int> > ed[N];
int ch[M][2], fail[M * 2], ok[M * 2], tot = 1;
void ins(int *A, int len) {
  int x = 1;
  for (int i = 1; i <= len; i++) {
    if (!ch[x][A[i]]) ch[x][A[i]] = ++tot;
    x = ch[x][A[i]];
  }
  ok[x] = 1;
}
void buildfail() {
  queue<int> q;
  for (int i = 0; i <= 1; i++)
    if (ch[1][i])
      fail[ch[1][i]] = 1, q.push(ch[1][i]);
    else
      ch[1][i] = 1;
  while (q.size()) {
    int x = q.front();
    q.pop();
    for (int i = 0; i <= 1; i++)
      if (ch[x][i]) {
        fail[ch[x][i]] = ch[fail[x]][i];
        ok[ch[x][i]] |= ok[fail[ch[x][i]]];
        q.push(ch[x][i]);
      } else
        ch[x][i] = ch[fail[x]][i];
  }
}
int id[M * 2], loc[M * 2];
struct Node {
  int x, fr, to;
  unsigned long long val;
  Node(int X = 0, int F = 0, int T = 0, unsigned long long V = 0)
      : x(X), fr(F), to(T), val(V) {}
  inline friend bool operator<(const Node &a, const Node &b) {
    return a.val > b.val;
  }
};
priority_queue<Node> hp;
int main() {
  IG = read() - 1;
  IN = read();
  IM = read();
  n = IG;
  for (int i = 1; i <= IN; i++) {
    int a = read(), k = read();
    for (int j = 1; j <= k; j++) ipt[j] = read(), issuf[j + n] = 1;
    for (int j = 2; j <= k; j++) {
      ed[n + j].push_back({n + j - 1, ipt[j - 1]});
      ed[ipt[j - 1]].push_back({n + j - 1, n + j});
    }
    ed[ipt[k]].push_back({n + k, -1});
    ed[n + 1].push_back({a, -1});
    n += k;
  }
  for (int i = 1; i <= IM; i++) {
    int len = read();
    for (int j = 1; j <= len; j++) ipt[j] = read();
    ins(ipt, len);
  }
  buildfail();
  int cnt = 0;
  for (int i = 1; i <= tot; i++)
    if (ok[i] == 0) id[i] = ++cnt, loc[cnt] = i;
  for (int i = 0; i <= n; i++)
    for (int j = 1; j <= cnt; j++)
      for (int k = 1; k <= cnt; k++) f[i][j][k] = INF;
  for (int i = 1; i <= cnt; i++) {
    int x = loc[i];
    if (id[ch[x][0]]) {
      f[0][i][id[ch[x][0]]] = 1;
      hp.push(Node(0, i, id[ch[x][0]], 1));
    }
    if (id[ch[x][1]]) {
      f[1][i][id[ch[x][1]]] = 1;
      hp.push(Node(1, i, id[ch[x][1]], 1));
    }
  }
  while (hp.size()) {
    Node tmp = hp.top();
    hp.pop();
    int x = tmp.x, fr = tmp.fr, to = tmp.to;
    unsigned long long val = tmp.val;
    if (vis[x][fr][to]) continue;
    vis[x][fr][to] = 1;
    for (auto e : ed[x]) {
      int y = e.first, w = e.second;
      if (w == -1) {
        if (f[y][fr][to] > val) {
          f[y][fr][to] = val;
          hp.push(Node(y, fr, to, f[y][fr][to]));
        }
      } else {
        if (issuf[x] == 0) {
          for (int j = 1; j <= cnt; j++)
            if (f[y][fr][j] > val + f[w][to][j]) {
              f[y][fr][j] = val + f[w][to][j];
              hp.push(Node(y, fr, j, f[y][fr][j]));
            }
        } else {
          for (int j = 1; j <= cnt; j++)
            if (f[y][j][to] > f[w][j][fr] + val) {
              f[y][j][to] = f[w][j][fr] + val;
              hp.push(Node(y, j, to, f[y][j][to]));
            }
        }
      }
    }
  }
  for (int i = 2; i <= IG; i++) {
    unsigned long long ans = INF;
    for (int j = 1; j <= cnt; j++) ans = min(ans, f[i][1][j]);
    if (ans == INF)
      printf("YES\n");
    else
      printf("NO %lld\n", ans);
  }
  return 0;
}
