#include <bits/stdc++.h>
using namespace std;
bool cur1;
int rd() {
  int res = 0, c, f = 0;
  while (!isdigit(c = getchar())) f = c == '-';
  do res = (res << 1) + (res << 3) + (c ^ 48);
  while (isdigit(c = getchar()));
  return f ? -res : res;
}
int G, n, m;
bool tomin(long long &a, long long b) {
  return (a == -1 || a > b) && ~b && (a = b, 1);
}
namespace p11 {
vector<int> v[105], g[105];
queue<int> q;
int inq[105];
long long dis[105];
void solve() {
  memset(dis, -1, sizeof dis);
  for (int i = 1, k; i <= n; i++) {
    v[i].push_back(rd()), k = rd();
    while (k--) v[i].push_back(rd());
    for (int j = 1; j < (int)v[i].size(); j++) g[v[i][j]].push_back(i);
  }
  memset(dis, -1, sizeof dis);
  dis[0] = dis[1] = inq[0] = inq[1] = 1, q.push(0), q.push(1);
  while (!q.empty()) {
    int x = q.front();
    inq[x] = 0, q.pop();
    for (int j = 0; j < (int)g[x].size(); j++) {
      int t = g[x][j];
      long long cur = 0;
      for (int k = 1; k < (int)v[t].size(); k++)
        if (~dis[v[t][k]] && ~cur)
          cur += dis[v[t][k]];
        else
          cur = -1;
      if (~cur && tomin(dis[v[t][0]], cur) && !inq[v[t][0]])
        q.push(v[t][0]), inq[v[t][0]] = 1;
    }
  }
  for (int i = 2; i < G; i++)
    if (~dis[i])
      printf("NO %lld\n", dis[i]);
    else
      puts("YES");
}
}  // namespace p11
namespace p25 {
struct Mat {
  int n, m;
  long long a[55][55];
  void init(int x, int y) { n = x, m = y, memset(a, -1, sizeof a); }
  Mat operator*(const Mat &b) {
    Mat c;
    c.init(n, b.m);
    for (int k = 0; k <= m; k++)
      for (int i = 0; i <= n; i++)
        if (~a[i][k])
          for (int j = 0; j <= b.m; j++)
            if (~b.a[k][j]) tomin(c.a[i][j], a[i][k] + b.a[k][j]);
    return c;
  }
  Mat operator+(const Mat &b) {
    Mat c;
    c.init(n, m);
    for (int i = 0; i <= n; i++)
      for (int j = 0; j <= m; j++)
        if (~a[i][j] && ~b.a[i][j]) c.a[i][j] = a[i][j] + b.a[i][j];
    return c;
  }
  void Out() {
    for (int i = 0; i <= n; i++, puts(""))
      for (int j = 0; j <= m; j++) printf("%lld ", a[i][j]);
    puts("");
  }
} t[105];
int ind[105];
vector<int> g[105], v[105];
queue<int> q;
int s[105], son[105][2], tot, flg[105], fal[105];
void Insert(int n) {
  int cur = 0;
  for (int i = 1; i <= n; i++) {
    int &nxt = son[cur][s[i]];
    if (!nxt) nxt = ++tot;
    cur = nxt;
  }
  flg[cur] = 1;
}
void init() {
  queue<int> q;
  for (int i = 0; i < 2; i++)
    if (son[0][i]) q.push(son[0][i]), fal[son[0][i]] = 0;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = 0; i < 2; i++)
      if (son[x][i])
        q.push(son[x][i]), fal[son[x][i]] = son[fal[x]][i];
      else
        son[x][i] = son[fal[x]][i];
  }
  for (int i = 0; i < G; i++)
    t[i].init(tot + 1, tot + 1), t[i].a[0][0] = i < 2 ? -1 : 0;
  for (int i = 0; i <= tot; i++) {
    if (flg[son[i][0]]) son[i][0] = tot + 1;
    if (flg[son[i][1]]) son[i][1] = tot + 1;
    t[0].a[i][son[i][0]] = 1;
    t[1].a[i][son[i][1]] = 1;
  }
  t[0].a[tot + 1][tot + 1] = 1;
  t[1].a[tot + 1][tot + 1] = 1;
}
void solve() {
  for (int i = 1; i <= n; i++) {
    int a = rd(), k = rd();
    while (k--) {
      int x = rd();
      v[a].push_back(x);
      g[x].push_back(a);
    }
    ind[a] += v[a].size();
  }
  for (int i = 1; i <= m; i++) {
    int l = rd();
    for (int j = 1; j <= l; j++) s[j] = rd();
    Insert(l);
  }
  init();
  q.push(0), q.push(1);
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    if (x >= 2)
      for (int i = 0; i < (int)v[x].size(); i++) t[x] = t[x] * t[v[x][i]];
    for (int i = 0; i < (int)g[x].size(); i++)
      if (--ind[g[x][i]] == 0) q.push(g[x][i]);
  }
  for (int i = 2; i < G; i++) {
    long long res = -1;
    for (int j = 0; j <= tot; j++) tomin(res, t[i].a[0][j]);
    if (~res)
      printf("NO %lld\n", res);
    else
      puts("YES");
  }
}
}  // namespace p25
namespace p100 {
struct Mat {
  int n, m;
  long long a[55][55];
  void init(int x, int y) { n = x, m = y, memset(a, -1, sizeof a); }
  Mat operator*(const Mat &b) {
    Mat c;
    c.init(n, b.m);
    for (int k = 0; k <= m; k++)
      for (int i = 0; i <= n; i++)
        if (~a[i][k])
          for (int j = 0; j <= b.m; j++)
            if (~b.a[k][j]) tomin(c.a[i][j], a[i][k] + b.a[k][j]);
    return c;
  }
  Mat operator+(const Mat &b) {
    Mat c;
    c.init(n, m);
    for (int i = 0; i <= n; i++)
      for (int j = 0; j <= m; j++) {
        c.a[i][j] = a[i][j];
        tomin(c.a[i][j], b.a[i][j]);
      }
    return c;
  }
  bool operator<(const Mat &b) {
    for (int i = 0; i <= n; i++)
      for (int j = 0; j <= m; j++)
        if (~a[i][j] && (b.a[i][j] == -1 || a[i][j] < b.a[i][j])) return 1;
    return 0;
  }
  void Out() {
    for (int i = 0; i <= n; i++, puts(""))
      for (int j = 0; j <= m; j++) printf("%lld ", a[i][j]);
    puts("");
  }
} t[105];
vector<int> g[105], v[105];
queue<int> q;
int inq[105], vis[105];
int s[105], son[105][2], tot, flg[105], fal[105];
void Insert(int n) {
  int cur = 0;
  for (int i = 1; i <= n; i++) {
    int &nxt = son[cur][s[i]];
    if (!nxt) nxt = ++tot;
    cur = nxt;
  }
  flg[cur] = 1;
}
void init() {
  queue<int> q;
  for (int i = 0; i < 2; i++)
    if (son[0][i]) q.push(son[0][i]), fal[son[0][i]] = 0;
  while (!q.empty()) {
    int x = q.front();
    q.pop();
    for (int i = 0; i < 2; i++)
      if (son[x][i]) {
        flg[son[x][i]] |= flg[x];
        fal[son[x][i]] = son[fal[x]][i];
        q.push(son[x][i]);
      } else
        son[x][i] = son[fal[x]][i];
  }
  for (int i = 1; i <= tot; i++) {
    int x = i;
    while (x) flg[i] |= flg[x], x = fal[x];
  }
  for (int i = 0; i < G; i++) t[i].init(tot, tot);
  for (int i = 0; i <= tot; i++) {
    if (!flg[son[i][0]]) t[0].a[i][son[i][0]] = 1;
    if (!flg[son[i][1]]) t[1].a[i][son[i][1]] = 1;
  }
}
void solve() {
  for (int i = 1, k; i <= n; i++) {
    v[i].push_back(rd()), k = rd();
    while (k--) v[i].push_back(rd());
    for (int j = 0; j < (int)v[i].size(); j++) g[v[i][j]].push_back(i);
  }
  for (int i = 1; i <= m; i++) {
    int l = rd();
    for (int j = 1; j <= l; j++) s[j] = rd();
    Insert(l);
  }
  init();
  q.push(0), q.push(1), inq[0] = inq[1] = vis[0] = vis[1] = 1;
  while (!q.empty()) {
    int x = q.front();
    inq[x] = 0, q.pop();
    for (int i = 0; i < (int)g[x].size(); i++) {
      int p = g[x][i], vv = 1;
      Mat cur;
      cur.init(tot, tot);
      for (int j = 0; j <= tot; j++) cur.a[j][j] = 0;
      for (int k = 1; k < (int)v[p].size(); k++)
        cur = cur * t[v[p][k]], vv &= vis[v[p][k]];
      if (vv && cur < t[v[p][0]]) {
        t[v[p][0]] = t[v[p][0]] + cur, vis[v[p][0]] = 1;
        if (!inq[v[p][0]]) q.push(v[p][0]), inq[v[p][0]] = 1;
      }
    }
  }
  for (int i = 2; i < G; i++) {
    long long res = -1;
    for (int j = 0; j <= tot; j++) tomin(res, t[i].a[0][j]);
    if (~res)
      printf("NO %lld\n", res);
    else
      puts("YES");
  }
}
}  // namespace p100
void my_main() {
  G = rd(), n = rd(), m = rd();
  p100::solve();
}
bool cur2;
int main() {
  my_main();
  return 0;
}
