#include <bits/stdc++.h>
const int maxn = 205;
const unsigned long long inf = 1ull << 63;
unsigned long long dp[205][205][205];
int ch[maxn][2], mark[maxn], a[maxn], k[maxn], b[maxn][maxn], link[maxn], g, n,
    m, tl, x, s[maxn];
struct data {
  unsigned long long v;
  int x, s, t;
};
std::priority_queue<data> q;
bool operator<(data a, data b) { return a.v > b.v; }
data dat(unsigned long long v1, int x1, int s1, int t1) {
  data d;
  d.v = v1;
  d.x = x1;
  d.s = s1;
  d.t = t1;
  return d;
}
void insert(int len) {
  int rt = 0;
  for (int i = 1; i <= len; ++i) {
    if (!ch[rt][s[i]]) ch[rt][s[i]] = ++tl;
    rt = ch[rt][s[i]];
  }
  mark[rt] = 1;
}
void build() {
  std::queue<int> q;
  std::memset(link, -1, sizeof(link));
  link[0] = 0;
  for (int i = 0; i < 2; ++i)
    if (ch[0][i]) {
      q.push(ch[0][i]);
      link[ch[0][i]] = 0;
    }
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    mark[u] |= mark[link[u]];
    for (int i = 0; i < 2; ++i) {
      if (ch[u][i]) {
        mark[ch[u][i]] |= mark[u];
        link[ch[u][i]] = ch[link[u]][i];
        q.push(ch[u][i]);
      } else
        ch[u][i] = ch[link[u]][i];
    }
  }
}
void update(int x, int s, int t, unsigned long long v) {
  if (v >= dp[x][s][t]) return;
  dp[x][s][t] = v;
  q.push(dat(v, x, s, t));
}
int main() {
  scanf("%d%d%d", &g, &n, &m);
  g--;
  int gi = g;
  for (int i = 1; i <= n; ++i) {
    scanf("%d%d", &a[i], &k[i]);
    for (int j = 1; j <= k[i]; ++j) scanf("%d", &b[i][j]);
  }
  for (int i = 1; i <= n; ++i) {
    if (k[i] > 2) {
      ++n;
      k[n] = k[i] - 1;
      a[n] = ++g;
      for (int j = 2; j <= k[i]; ++j) b[n][j - 1] = b[i][j];
      k[i] = 2;
      b[i][2] = g;
    }
  }
  for (int i = 1; i <= m; ++i) {
    scanf("%d", &x);
    for (int j = 1; j <= x; ++j) scanf("%d", &s[j]);
    insert(x);
  }
  build();
  for (int i = 0; i <= g; ++i)
    for (int j = 0; j <= tl; ++j)
      for (int k = 0; k <= tl; ++k) dp[i][j][k] = inf;
  for (int i = 0; i < 2; ++i) {
    for (int j = 0; j <= tl; ++j)
      if (!mark[j] && !mark[ch[j][i]]) {
        dp[i][j][ch[j][i]] = 1;
        q.push(dat(1, i, j, ch[j][i]));
      }
  }
  while (!q.empty()) {
    data d = q.top();
    q.pop();
    unsigned long long v = d.v;
    int s = d.s, t = d.t, x = d.x;
    if (v != dp[x][s][t]) continue;
    for (int j = 1; j <= n; ++j) {
      if (k[j] == 1 && b[j][1] == x) update(a[j], s, t, v);
      if (k[j] == 2) {
        if (b[j][1] == x)
          for (int T = 0; T <= tl; ++T)
            update(a[j], s, T, v + dp[b[j][2]][t][T]);
        if (b[j][2] == x)
          for (int S = 0; S <= tl; ++S)
            update(a[j], S, t, v + dp[b[j][1]][S][s]);
      }
    }
  }
  for (int i = 2; i <= gi; ++i) {
    unsigned long long ans = inf;
    for (int j = 0; j <= tl; ++j) ans = std::min(ans, dp[i][0][j]);
    if (ans == inf)
      puts("YES");
    else
      printf("NO %lld\n", ans);
  }
  return 0;
}
