#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;   }