function Main(input) {
    var result;
    const N = parseInt(input[0].split(/\s/)[0]);
    const M = parseInt(input.shift().split(/\s/)[1]);

    const KS = input.slice(0, M).map(value => value.split(/\s/).map(v => parseInt(v)));
    const P = input.slice(M)[0].split(/\s/);
    
    var count = 0;
    generateMap(N).forEach(SW => check(SW, KS, P) == true ? count++ : 0);
    // check([1,1], KS, P);
    console.log(count);
    
}

function generateMap(N) {
    var arr = [];
    for (var index = 0; index < Math.pow(2, N); index++) {
        var value = index;
        var insert = [];
        for (var i = 0; i < N; i++) {
            insert.push(value % 2);
            value = Math.floor(value/2);
        }
        arr.push(insert);
    }
    return arr;
}

function check(sw, KS, P){
    // console.log(sw,KS,P);
    for (var index = 0; index < KS.length; index++) {
        var ks = KS[index];
        var check = 0;
        for (var i = 1; i < ks.length; i++) {
            var s = ks[i]-1;
            // console.log("sw[s]", sw[s]);
            if(sw[s] == 1) check++;
        }
        
        
        if(P[index] == "1") check++;
        // console.log(index, check);
        
        if(check%2 > 0) return false;
    };
    
    
    return true;
}

// 1行入力の場合
// Main(require("fs").readFileSync("/dev/stdin", "utf8").trim());

// 改行で分割
Main(require("fs").readFileSync("/dev/stdin", "utf8").trim().split(/\n/));

// 改行・空白で分割
// Main(require("fs").readFileSync("/dev/stdin", "utf8").trim().split(/\n|\s/));