#include <bits/stdc++.h>
using namespace std;
struct gene {
  int gInd;
  vector<int> sor;
  vector<vector<vector<bool>>> volt;
};
struct pont {
  int t[2] = {-1, -1};
  int c, os = -1, tav = 0;
  bool veg = false;
};
struct adat {
  int ind, sorInd, kezd, koz, veg;
  long long ert;
  bool operator<(adat a) const { return ert > a.ert; }
};
long long table[102][51][51];
vector<adat> elek[102][51][51];
int maxn;
vector<pont> trie;
void Init() {
  trie.push_back(pont());
  return;
}
void Add(vector<int> &v) {
  int x = 0;
  for (int y : v) {
    if (trie[x].t[y] == -1) {
      trie[x].t[y] = (int)trie.size();
      trie.push_back(pont());
      trie[trie[x].t[y]].tav = trie[x].tav + 1;
      trie[trie[x].t[y]].os = x;
      trie[trie[x].t[y]].c = y;
    }
    x = trie[x].t[y];
  }
  trie[x].veg = true;
  return;
}
bool sortFunc(int a, int b) { return trie[a].tav < trie[b].tav; }
void AhoCorasick() {
  vector<int> sor((int)trie.size() - 1);
  for (int i = 0; i < (int)trie.size() - 1; i++) sor[i] = i + 1;
  sort(sor.begin(), sor.end(), sortFunc);
  if (trie[0].t[0] == -1) trie[0].t[0] = 0;
  if (trie[0].t[1] == -1) trie[0].t[1] = 0;
  for (int x : sor) {
    trie[x].os = trie[trie[x].os].os;
    if (trie[x].os == -1)
      trie[x].os = 0;
    else
      trie[x].os = trie[trie[x].os].t[trie[x].c];
    if (trie[x].t[0] == -1) trie[x].t[0] = trie[trie[x].os].t[0];
    if (trie[x].t[1] == -1) trie[x].t[1] = trie[trie[x].os].t[1];
    trie[x].veg = (trie[x].veg | trie[trie[x].os].veg);
  }
  maxn = trie.size();
  return;
}
void UjElem(vector<gene> &v, priority_queue<adat> &pq, adat d) {
  if (v[d.ind].volt[d.sorInd][d.kezd][d.veg]) return;
  if (table[v[d.ind].sor[d.sorInd]][d.koz][d.veg] == -1) {
    elek[v[d.ind].sor[d.sorInd]][d.koz][d.veg].push_back(d);
    return;
  }
  d.ert += table[v[d.ind].sor[d.sorInd]][d.koz][d.veg];
  d.sorInd++;
  pq.push(d);
  return;
}
void Megold(vector<gene> &v) {
  priority_queue<adat> pq;
  for (int i = 0; i < (int)v.size(); i++)
    for (int j = 0; j < maxn; j++)
      for (int k = 0; k < maxn; k++) UjElem(v, pq, {i, 0, j, j, k, 0});
  while (pq.size() > 0) {
    adat d = pq.top();
    pq.pop();
    if (v[d.ind].volt[d.sorInd - 1][d.kezd][d.veg]) continue;
    v[d.ind].volt[d.sorInd - 1][d.kezd][d.veg] = true;
    if (d.sorInd == (int)v[d.ind].sor.size() &&
        (table[v[d.ind].gInd][d.kezd][d.veg] == -1 ||
         d.ert < table[v[d.ind].gInd][d.kezd][d.veg])) {
      table[v[d.ind].gInd][d.kezd][d.veg] = d.ert;
      for (adat temp : elek[v[d.ind].gInd][d.kezd][d.veg]) UjElem(v, pq, temp);
      elek[v[d.ind].gInd][d.kezd][d.veg].clear();
      continue;
    } else if (d.sorInd == (int)v[d.ind].sor.size())
      continue;
    for (int i = 0; i < maxn; i++) {
      adat d2 = d;
      d2.koz = d.veg;
      d2.veg = i;
      UjElem(v, pq, d2);
    }
  }
  return;
}
int main() {
  cin.sync_with_stdio(false);
  cin.tie(0);
  int g, n, m;
  cin >> g >> n >> m;
  vector<gene> v(n);
  for (int i = 0; i < n; i++) {
    int a;
    cin >> v[i].gInd;
    cin >> a;
    v[i].sor.resize(a);
    for (int j = 0; j < a; j++) cin >> v[i].sor[j];
  }
  Init();
  for (int i = 0; i < m; i++) {
    int a;
    cin >> a;
    vector<int> sor(a);
    for (int j = 0; j < a; j++) cin >> sor[j];
    Add(sor);
  }
  AhoCorasick();
  for (int i = 0; i < n; i++)
    v[i].volt.resize(v[i].sor.size(),
                     vector<vector<bool>>(maxn, vector<bool>(maxn, false)));
  for (int i = 0; i < g; i++)
    for (int j = 0; j < maxn; j++)
      for (int k = 0; k < maxn; k++) table[i][j][k] = -1;
  for (int i = 0; i < 2; i++)
    for (int j = 0; j < maxn; j++)
      if (!trie[j].veg && !trie[trie[j].t[i]].veg)
        table[i][j][trie[j].t[i]] = 1;
  Megold(v);
  for (int i = 2; i < g; i++) {
    long long legK = -1;
    for (int j = 0; j < maxn; j++)
      if (table[i][0][j] != -1 && (legK == -1 || table[i][0][j] < legK))
        legK = table[i][0][j];
    if (legK == -1)
      cout << "YES\n";
    else
      cout << "NO " << legK << "\n";
  }
  return 0;
}
