#include <bits/stdc++.h>   using namespace std;   long n, m;   vector<long> clauses[100000 + 1];   vector<long> variables[100000 + 1];   long long ans[2] = {0};   bool check_clauses[100000 + 1] = {false};   long long dp_path[100000 + 1][2][2];   long long dp_cycle[100000 + 1][2][2][2];   void path_component(long start_clause) {     long cur_clause = 0, nxt_clause = 0, variable = 0;     long long temp[2];     if (clauses[start_clause].size() == 1) {       variable = abs(clauses[start_clause][0]);       if (variables[variable].size() == 1) {         if ((ans[0] == 0) && (ans[1] == 0)) {           ans[1] = 1;           ans[0] = 1;         } else {           temp[1] = (ans[1] + ans[0]) % 1000000007;           temp[0] = (ans[1] + ans[0]) % 1000000007;           ans[1] = temp[1];           ans[0] = temp[0];         }         return;       }       nxt_clause = (abs(variables[variable][0]) != start_clause)                        ? abs(variables[variable][0])                        : abs(variables[variable][1]);       if ((long long)variables[variable][0] * (long long)variables[variable][1] >           0) {         dp_path[nxt_clause][1][1] = 0;         dp_path[nxt_clause][1][0] = 1;         dp_path[nxt_clause][0][1] = 0;         dp_path[nxt_clause][0][0] = 1;       } else {         dp_path[nxt_clause][1][1] = 1;         dp_path[nxt_clause][1][0] = 0;         dp_path[nxt_clause][0][1] = 1;         dp_path[nxt_clause][0][0] = 0;       }       cur_clause = nxt_clause;     } else {       if ((variables[abs(clauses[start_clause][0])].size() == 2) &&           (variables[abs(clauses[start_clause][1])].size() == 2))         return;       variable = (variables[abs(clauses[start_clause][0])].size() == 1)                      ? abs(clauses[start_clause][0])                      : abs(clauses[start_clause][1]);       cur_clause = start_clause;       dp_path[start_clause][1][1] = 1;       dp_path[start_clause][1][0] = 0;       dp_path[start_clause][0][1] = 0;       dp_path[start_clause][0][0] = 1;     }     if (check_clauses[start_clause]) return;     check_clauses[start_clause] = true;     check_clauses[cur_clause] = true;     while (true) {       if (clauses[cur_clause].size() == 1) {         if ((ans[0] == 0) && (ans[1] == 0)) {           ans[0] = (dp_path[cur_clause][0][0] + dp_path[cur_clause][1][0]) %                    1000000007;           ans[1] = (dp_path[cur_clause][0][1] + dp_path[cur_clause][1][1]) %                    1000000007;         } else {           temp[0] = ((ans[1] *                       ((dp_path[cur_clause][0][1] + dp_path[cur_clause][1][1]) %                        1000000007)) %                          1000000007 +                      (ans[0] *                       ((dp_path[cur_clause][0][0] + dp_path[cur_clause][1][0]) %                        1000000007)) %                          1000000007) %                     1000000007;           temp[1] = ((ans[1] *                       ((dp_path[cur_clause][0][0] + dp_path[cur_clause][1][0]) %                        1000000007)) %                          1000000007 +                      (ans[0] *                       ((dp_path[cur_clause][0][1] + dp_path[cur_clause][1][1]) %                        1000000007)) %                          1000000007) %                     1000000007;           ans[0] = temp[0];           ans[1] = temp[1];         }         return;       }       variable = (abs(clauses[cur_clause][0]) != variable)                      ? abs(clauses[cur_clause][0])                      : abs(clauses[cur_clause][1]);       if (variables[variable].size() == 1) {         long long dp_temp[2][2];         dp_temp[0][1] = dp_path[cur_clause][0][1];         dp_temp[0][0] = dp_path[cur_clause][0][0];         dp_temp[1][1] =             (dp_path[cur_clause][0][0] + 2 * dp_path[cur_clause][1][1]) %             1000000007;         dp_temp[1][0] =             (dp_path[cur_clause][0][1] + 2 * dp_path[cur_clause][1][0]) %             1000000007;         if ((ans[0] == 0) && (ans[1] == 0)) {           ans[0] = (dp_temp[0][0] + dp_temp[1][0]) % 1000000007;           ans[1] = (dp_temp[0][1] + dp_temp[1][1]) % 1000000007;         } else {           temp[0] = ((ans[1] * ((dp_temp[0][1] + dp_temp[1][1]) % 1000000007)) %                          1000000007 +                      (ans[0] * ((dp_temp[0][0] + dp_temp[1][0]) % 1000000007)) %                          1000000007) %                     1000000007;           temp[1] = ((ans[1] * ((dp_temp[0][0] + dp_temp[1][0]) % 1000000007)) %                          1000000007 +                      (ans[0] * ((dp_temp[0][1] + dp_temp[1][1]) % 1000000007)) %                          1000000007) %                     1000000007;           ans[0] = temp[0];           ans[1] = temp[1];         }         return;       }       nxt_clause = (abs(variables[variable][0]) != cur_clause)                        ? abs(variables[variable][0])                        : abs(variables[variable][1]);       check_clauses[nxt_clause] = true;       if ((long long)variables[variable][0] * (long long)variables[variable][1] >           0) {         dp_path[nxt_clause][0][1] =             (dp_path[cur_clause][1][1] + dp_path[cur_clause][0][1]) % 1000000007;         dp_path[nxt_clause][0][0] =             (dp_path[cur_clause][1][0] + dp_path[cur_clause][0][0]) % 1000000007;         dp_path[nxt_clause][1][1] =             (dp_path[cur_clause][1][0] + dp_path[cur_clause][0][1]) % 1000000007;         dp_path[nxt_clause][1][0] =             (dp_path[cur_clause][1][1] + dp_path[cur_clause][0][0]) % 1000000007;       } else {         dp_path[nxt_clause][1][1] =             (dp_path[cur_clause][1][0] + dp_path[cur_clause][0][0]) % 1000000007;         dp_path[nxt_clause][1][0] =             (dp_path[cur_clause][1][1] + dp_path[cur_clause][0][1]) % 1000000007;         dp_path[nxt_clause][0][1] =             (dp_path[cur_clause][1][1] + dp_path[cur_clause][0][0]) % 1000000007;         dp_path[nxt_clause][0][0] =             (dp_path[cur_clause][1][0] + dp_path[cur_clause][0][1]) % 1000000007;       }       cur_clause = nxt_clause;     }   }   void cycle_component(long start_clause) {     long cur_clause = 0, nxt_clause = 0, variable = 0;     long long temp[2];     if (clauses[start_clause].size() == 1) return;     if ((variables[abs(clauses[start_clause][0])].size() == 1) ||         (variables[abs(clauses[start_clause][1])].size() == 1))       return;     if (check_clauses[start_clause]) return;     check_clauses[start_clause] = true;     variable = abs(clauses[start_clause][0]);     nxt_clause = (abs(variables[variable][0]) != start_clause)                      ? abs(variables[variable][0])                      : abs(variables[variable][1]);     if (nxt_clause == start_clause) {       if ((long long)variables[variable][0] * (long long)variables[variable][1] >           0) {         if ((ans[0] == 0) && (ans[1] == 0)) {           ans[1] = 1;           ans[0] = 1;         } else {           temp[1] = (ans[1] + ans[0]) % 1000000007;           temp[0] = (ans[1] + ans[0]) % 1000000007;           ans[1] = temp[1];           ans[0] = temp[0];         }       } else {         if ((ans[0] == 0) && (ans[1] == 0)) {           ans[1] = 2;           ans[0] = 0;         } else {           temp[1] = 2 * ans[0];           temp[0] = 2 * ans[1];           ans[1] = temp[1];           ans[0] = temp[0];         }       }       return;     }     if ((long long)variables[variable][0] * (long long)variables[variable][1] >         0) {       dp_cycle[nxt_clause][1][1][1] = 0;       dp_cycle[nxt_clause][1][1][0] = 1;       dp_cycle[nxt_clause][1][0][1] = 0;       dp_cycle[nxt_clause][1][0][0] = 0;       dp_cycle[nxt_clause][0][1][1] = 0;       dp_cycle[nxt_clause][0][1][0] = 0;       dp_cycle[nxt_clause][0][0][1] = 0;       dp_cycle[nxt_clause][0][0][0] = 1;     } else {       dp_cycle[nxt_clause][1][1][1] = 0;       dp_cycle[nxt_clause][1][1][0] = 0;       dp_cycle[nxt_clause][1][0][1] = 1;       dp_cycle[nxt_clause][1][0][0] = 0;       dp_cycle[nxt_clause][0][1][1] = 1;       dp_cycle[nxt_clause][0][1][0] = 0;       dp_cycle[nxt_clause][0][0][1] = 0;       dp_cycle[nxt_clause][0][0][0] = 0;     }     cur_clause = nxt_clause;     while (true) {       check_clauses[cur_clause] = true;       variable = (abs(clauses[cur_clause][0]) != variable)                      ? abs(clauses[cur_clause][0])                      : abs(clauses[cur_clause][1]);       nxt_clause = (abs(variables[variable][0]) != cur_clause)                        ? abs(variables[variable][0])                        : abs(variables[variable][1]);       if (nxt_clause == start_clause) {         long long dp_temp[2][2];         if ((long long)variables[variable][0] *                 (long long)variables[variable][1] >             0) {           dp_temp[0][1] =               (dp_cycle[cur_clause][1][1][1] + dp_cycle[cur_clause][1][0][1] +                dp_cycle[cur_clause][0][1][1] + dp_cycle[cur_clause][0][0][1]) %               1000000007;           dp_temp[0][0] =               (dp_cycle[cur_clause][1][1][0] + dp_cycle[cur_clause][1][0][0] +                dp_cycle[cur_clause][0][1][0] + dp_cycle[cur_clause][0][0][0]) %               1000000007;           dp_temp[1][1] =               (dp_cycle[cur_clause][1][1][1] + dp_cycle[cur_clause][1][0][0] +                dp_cycle[cur_clause][0][1][0] + dp_cycle[cur_clause][0][0][1]) %               1000000007;           dp_temp[1][0] =               (dp_cycle[cur_clause][1][1][0] + dp_cycle[cur_clause][1][0][1] +                dp_cycle[cur_clause][0][1][1] + dp_cycle[cur_clause][0][0][0]) %               1000000007;         } else {           dp_temp[1][1] =               (dp_cycle[cur_clause][1][1][1] + dp_cycle[cur_clause][1][0][0] +                dp_cycle[cur_clause][0][1][1] + dp_cycle[cur_clause][0][0][0]) %               1000000007;           dp_temp[1][0] =               (dp_cycle[cur_clause][1][1][0] + dp_cycle[cur_clause][1][0][1] +                dp_cycle[cur_clause][0][1][0] + dp_cycle[cur_clause][0][0][1]) %               1000000007;           dp_temp[0][1] =               (dp_cycle[cur_clause][1][1][1] + dp_cycle[cur_clause][1][0][1] +                dp_cycle[cur_clause][0][1][0] + dp_cycle[cur_clause][0][0][0]) %               1000000007;           dp_temp[0][0] =               (dp_cycle[cur_clause][1][1][0] + dp_cycle[cur_clause][1][0][0] +                dp_cycle[cur_clause][0][1][1] + dp_cycle[cur_clause][0][0][1]) %               1000000007;         }         if ((ans[0] == 0) && (ans[1] == 0)) {           ans[0] = (dp_temp[0][0] + dp_temp[1][0]) % 1000000007;           ans[1] = (dp_temp[0][1] + dp_temp[1][1]) % 1000000007;         } else {           temp[0] = ((ans[1] * ((dp_temp[0][1] + dp_temp[1][1]) % 1000000007)) %                          1000000007 +                      (ans[0] * ((dp_temp[0][0] + dp_temp[1][0]) % 1000000007)) %                          1000000007) %                     1000000007;           temp[1] = ((ans[1] * ((dp_temp[0][0] + dp_temp[1][0]) % 1000000007)) %                          1000000007 +                      (ans[0] * ((dp_temp[0][1] + dp_temp[1][1]) % 1000000007)) %                          1000000007) %                     1000000007;           ans[0] = temp[0];           ans[1] = temp[1];         }         return;       }       if ((long long)variables[variable][0] * (long long)variables[variable][1] >           0) {         for (long i = 0; i <= 1; i++) {           dp_cycle[nxt_clause][i][0][1] =               (dp_cycle[cur_clause][i][0][1] + dp_cycle[cur_clause][i][1][1]) %               1000000007;           dp_cycle[nxt_clause][i][0][0] =               (dp_cycle[cur_clause][i][0][0] + dp_cycle[cur_clause][i][1][0]) %               1000000007;           dp_cycle[nxt_clause][i][1][1] =               (dp_cycle[cur_clause][i][0][1] + dp_cycle[cur_clause][i][1][0]) %               1000000007;           dp_cycle[nxt_clause][i][1][0] =               (dp_cycle[cur_clause][i][0][0] + dp_cycle[cur_clause][i][1][1]) %               1000000007;         }       } else {         for (long i = 0; i <= 1; i++) {           dp_cycle[nxt_clause][i][1][1] =               (dp_cycle[cur_clause][i][0][0] + dp_cycle[cur_clause][i][1][0]) %               1000000007;           dp_cycle[nxt_clause][i][1][0] =               (dp_cycle[cur_clause][i][0][1] + dp_cycle[cur_clause][i][1][1]) %               1000000007;           dp_cycle[nxt_clause][i][0][1] =               (dp_cycle[cur_clause][i][0][0] + dp_cycle[cur_clause][i][1][1]) %               1000000007;           dp_cycle[nxt_clause][i][0][0] =               (dp_cycle[cur_clause][i][0][1] + dp_cycle[cur_clause][i][1][0]) %               1000000007;         }       }       cur_clause = nxt_clause;     }   }   int main() {     cin >> n >> m;     for (long i = 1; i <= n; i++) {       long k;       cin >> k;       clauses[i].resize(k);       for (long j = 0; j < k; j++) {         cin >> clauses[i][j];         if (clauses[i][j] < 0)           variables[-clauses[i][j]].push_back(-i);         else           variables[clauses[i][j]].push_back(i);       }     }     for (long i = 1; i <= n; i++) {       path_component(i);     }     for (long i = 1; i <= n; i++) {       cycle_component(i);     }     for (long i = 1; i <= m; i++) {       if (variables[i].size() == 0) {         ans[0] = (ans[0] * 2) % 1000000007;         ans[1] = (ans[1] * 2) % 1000000007;       }     }     ans[0] = ans[0] % 1000000007;     ans[1] = ans[1] % 1000000007;     cout << ans[1] << endl;     return 0;   }