#include <bits/stdc++.h>
using namespace std;
vector<array<int, 2>> tree(1);
int terminal[110];
unsigned long long inf = (1ull << 63) - 1;
int s;
struct Mat {
  vector<unsigned long long> data;
  Mat() { data.assign(s * s, inf); }
};
Mat operator*(const Mat& a, const Mat& b) {
  Mat r;
  for (int i = 0; i < s; i++) {
    for (int k = 0; k < s; k++) {
      for (int j = 0; j < s; j++) {
        r.data[i * s + j] =
            min(r.data[i * s + j], a.data[i * s + k] + b.data[k * s + j]);
      }
    }
  }
  return r;
}
int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  int g, n, m;
  cin >> g >> n >> m;
  vector<pair<int, vector<int>>> mut;
  vector<vector<vector<int>>> node(g);
  for (int i = 0; i < n; i++) {
    int a, k;
    cin >> a >> k;
    node[a].push_back(vector<int>(k));
    mut.emplace_back(a, vector<int>());
    for (int& v : node[a].back()) {
      cin >> v;
      mut.back().second.push_back(v);
    }
  }
  for (int i = 0; i < m; i++) {
    int k;
    cin >> k;
    int p = 0;
    while (k--) {
      int c;
      cin >> c;
      if (!tree[p][c]) {
        tree[p][c] = tree.size();
        tree.push_back({0, 0});
      }
      p = tree[p][c];
    }
    terminal[p] = 1;
  }
  {
    vector<int> link(tree.size());
    queue<int> q;
    q.push(0);
    while (q.size()) {
      int p = q.front();
      q.pop();
      int par = link[p];
      terminal[p] |= terminal[par];
      for (int c : {0, 1}) {
        if (!tree[p][c]) {
          tree[p][c] = tree[par][c];
        } else {
          link[tree[p][c]] = p ? tree[par][c] : 0;
          q.push(tree[p][c]);
        }
      }
    }
  }
  s = tree.size();
  for (int p = 0; p < s; p++)
    if (terminal[p]) tree[p][0] = tree[p][1] = p;
  vector<Mat> mat(g);
  for (int c : {0, 1}) {
    for (int i = 0; i < s; i++) {
      mat[c].data[i * s + tree[i][c]] = 1;
    }
  }
  vector<int> changed(g, 1);
  while (1) {
    int found = 0;
    vector<int> nchanged(g);
    for (auto& [a, v] : mut) {
      int need = 0;
      for (int b : v)
        if (changed[b]) need = 1;
      if (!need) continue;
      Mat prod = mat[v[0]];
      for (int i = 1; i < (int)v.size(); i++) {
        prod = prod * mat[v[i]];
      }
      for (int i = 0; i < s * s; i++) {
        if (prod.data[i] < mat[a].data[i]) {
          mat[a].data[i] = prod.data[i];
          nchanged[a] = 1;
          found = 1;
        }
      }
    }
    changed = nchanged;
    if (!found) break;
  }
  for (int a = 2; a < g; a++) {
    unsigned long long mi = inf;
    for (int i = 0; i < s; i++) {
      if (!terminal[i]) mi = min(mi, mat[a].data[i]);
    }
    if (mi < inf)
      cout << "NO " << mi << endl;
    else
      cout << "YES" << endl;
  }
}
