#include #include #include "optimization.h" #include #include using namespace std; using ind = size_t; constexpr int N = 202; struct Gauss { vector> A; vector col; ind n, m; Gauss(ind n, ind m) : n(n), m(m) {} int add(bitset a) { for (ind i = 0; i < A.size(); ++i) { if (a[col[i]]) { a ^= A[i]; } } ind i = 0; while (i < n && !a[i]) i++; if (i == n) return 0; if(i == n - 1) return -1; A.push_back(std::move(a)); col.push_back(i); return 1; } bitset getX() { ind k = A.size(); bitset x; for(int i = k - 1; i >= 0; i--) { x[col[i]] = A[i][m]; for(ind j = i + 1; j < k; j++) { x[col[i]] = x[col[i]] ^ (A[i][col[j]] & x[col[j]]); } } return x; } }; int main() { int n = readInt(); Gauss g(n + 1, n); vector> m(n); for (int i = 0; i < n; ++i) { int k = readInt(); for (int j = 0; j < k; ++j) { int b = readInt() - 1; m[b][i] = true; } } for (int i = 0; i < n; ++i) { m[i][n] = readInt() == 1; } for(auto& v : m) { if(g.add(v) == -1) { // writeInt(-1, '\n'); // return 0; } } auto x = g.getX(); for(auto v : m) { bool a = v[n]; for(int i = 0; i < n; i++) { a ^= v[i] & x[i]; } if(a != 0) { writeInt(-1, '\n'); return 0; } } writeInt(x.count(), '\n'); for (int i = 0; i < n; ++i) { if(x[i]) { writeInt(i + 1, ' '); } } return 0; }