#include <bits/stdc++.h>   using namespace std;   const int MAX = 1005;   mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());   long long rand(long long a, long long b) {     return uniform_int_distribution<long long>(a, b)(rng);   }   const int K = 3;   struct Hash {     long long a[K];     Hash() : a() {}     Hash operator^(const Hash &A) const {       Hash ans = Hash();       for (int i = 0; i < K; i++) ans.a[i] = a[i] ^ A.a[i];       return ans;     }     bool operator==(const Hash &A) const {       for (int i = 0; i < K; i++)         if (a[i] != A.a[i]) return false;       return true;     }     bool operator<(const Hash &A) const {       for (int i = 0; i < K; i++)         if (a[i] != A.a[i]) return a[i] < A.a[i];       return false;     }   };   Hash genHash() {     Hash ret = Hash();     for (int i = 0; i < K; i++) ret.a[i] = rand(1, 1LL << 60);     return ret;   }   int main() {     ios_base::sync_with_stdio(false);     cin.tie(0);     cout.tie(0);     int n, s, d;     cin >> n >> s >> d;     Hash hash[n], sw[s];     for (int i = 0; i < n; i++) hash[i] = genHash();     for (int i = 0; i < s; i++) {       int k;       cin >> k;       Hash cur = Hash();       while (k--) {         int x;         cin >> x;         cur = cur ^ hash[x - 1];       }       sw[i] = cur;     }     map<Hash, int> left_sz;     int left = min(s / 2, 13);     for (int mask = 0; mask < (1 << left); mask++) {       Hash cur = Hash();       for (int bit = 0; bit < left; bit++) {         if (!((mask >> bit) & 1)) continue;         cur = cur ^ sw[bit];       }       if (!left_sz.count(cur))         left_sz[cur] = __builtin_popcountll(mask);       else         left_sz[cur] = min(left_sz[cur], __builtin_popcountll(mask));     }     map<Hash, int> right_sz;     int right = s - left;     for (int mask = 0; mask < (1 << right); mask++) {       Hash cur = Hash();       for (int bit = 0; bit < right; bit++) {         if (!((mask >> bit) & 1)) continue;         cur = cur ^ sw[bit + left];       }       if (!right_sz.count(cur))         right_sz[cur] = __builtin_popcountll(mask);       else         right_sz[cur] = min(right_sz[cur], __builtin_popcountll(mask));     }     while (d--) {       Hash cur = Hash();       int sz;       cin >> sz;       for (int i = 0; i < sz; i++) {         int x;         cin >> x;         cur = cur ^ hash[x - 1];       }       int ans = 100;       for (auto p : left_sz) {         Hash tmp = cur ^ p.first;         if (right_sz.count(tmp)) ans = min(ans, p.second + right_sz[tmp]);         if (left_sz.count(tmp)) {           if (tmp == p.first)             ans = 0;           else             ans = min(ans, p.second + left_sz[tmp]);         }       }       cout << (ans == 100 ? -1 : ans) <<   n ;     }     return 0;   }   