#include <bits/stdc++.h>
using namespace std;
int n, m;
const int mod = 1e9 + 7;
struct Edge {
  int to, next, v;
} edge[200011 << 1];
int first[200011], le = 2;
void in(int x, int y, int v) {
  Edge &e = edge[le];
  e.to = y;
  e.v = v;
  e.next = first[x];
  first[x] = le++;
}
void insert(int x, int y, int v) {
  in(x, y, v);
  in(y, x, v);
}
struct Node {
  int k, id[2];
} a[200011];
int appear[200011], h[200011][2], final[200011][2], start[200011], tot = 0;
bool vis[200011];
int sta[200011], top = 0;
void findstart(int x, int fa) {
  vis[x] = 1;
  sta[++top] = x;
  bool flag = 0;
  for (int i = first[x]; i; i = edge[i].next) {
    if (i == fa || (i ^ 1) == fa) continue;
    flag = 1;
    const Edge &e = edge[i];
    if (vis[e.to])
      start[tot] = e.to;
    else
      findstart(e.to, i);
  }
  if (!flag) start[tot] = x;
  if (flag && fa == 0 && !start[tot]) start[tot] = x;
}
int now, f[200011][2][2][2];
void dfs(int x, int fa) {
  f[x][0][0][0] %= mod;
  f[x][0][0][1] %= mod;
  f[x][0][1][0] %= mod;
  f[x][0][1][1] %= mod;
  f[x][1][0][0] %= mod;
  f[x][1][0][1] %= mod;
  f[x][1][1][0] %= mod;
  f[x][1][1][1] %= mod;
  vis[x] = 1;
  if (!fa) {
    if (a[x].k == 2)
      f[x][0][0][0] = f[x][1][1][0] = 1;
    else
      f[x][0][0][0] = 1;
  }
  bool flag = 0;
  for (int i = first[x]; i; i = edge[i].next) {
    if (i == fa || (i ^ 1) == fa) continue;
    const Edge &e = edge[i];
    if (vis[e.to] && !fa) continue;
    flag = 1;
    bool diff;
    for (int j = 0; j < a[x].k; j++)
      for (int k = 0; k < a[e.to].k; k++)
        if (fabs(a[x].id[j]) == fabs(a[e.to].id[k]) && fabs(a[x].id[j]) == e.v)
          diff = (a[x].id[j] == -a[e.to].id[k]);
    if (vis[e.to]) {
      if (!diff) {
        h[now][0] = (0ll + f[x][0][0][0] + f[x][0][1][1] + f[x][1][0][1] +
                     f[x][1][1][1]) %
                    mod;
        h[now][1] = (0ll + f[x][0][1][0] + f[x][0][0][1] + f[x][1][0][0] +
                     f[x][1][1][0]) %
                    mod;
      } else {
        h[now][0] = (0ll + f[x][0][1][1] + f[x][1][0][0] + f[x][0][0][1] +
                     f[x][1][1][1]) %
                    mod;
        h[now][1] = (0ll + f[x][0][0][0] + f[x][0][1][0] + f[x][1][1][0] +
                     f[x][1][0][1]) %
                    mod;
      }
    } else {
      if (!diff) {
        f[e.to][0][1][1] += f[x][0][0][0];
        f[e.to][0][0][0] += f[x][0][0][0];
        f[e.to][0][1][1] += f[x][0][1][0];
        f[e.to][0][0][1] += f[x][0][1][0];
        f[e.to][0][1][0] += f[x][0][0][1];
        f[e.to][0][0][1] += f[x][0][0][1];
        f[e.to][0][1][0] += f[x][0][1][1];
        f[e.to][0][0][0] += f[x][0][1][1];
        f[e.to][1][1][1] += f[x][1][0][0];
        f[e.to][1][0][0] += f[x][1][0][0];
        f[e.to][1][1][1] += f[x][1][1][0];
        f[e.to][1][0][1] += f[x][1][1][0];
        f[e.to][1][1][0] += f[x][1][0][1];
        f[e.to][1][0][1] += f[x][1][0][1];
        f[e.to][1][1][0] += f[x][1][1][1];
        f[e.to][1][0][0] += f[x][1][1][1];
      } else {
        f[e.to][0][0][1] += f[x][0][0][0];
        f[e.to][0][1][0] += f[x][0][0][0];
        f[e.to][0][1][1] += f[x][0][1][0];
        f[e.to][0][0][1] += f[x][0][1][0];
        f[e.to][0][1][1] += f[x][0][0][1];
        f[e.to][0][0][0] += f[x][0][0][1];
        f[e.to][0][1][0] += f[x][0][1][1];
        f[e.to][0][0][0] += f[x][0][1][1];
        f[e.to][1][0][1] += f[x][1][0][0];
        f[e.to][1][1][0] += f[x][1][0][0];
        f[e.to][1][1][1] += f[x][1][1][0];
        f[e.to][1][0][1] += f[x][1][1][0];
        f[e.to][1][1][1] += f[x][1][0][1];
        f[e.to][1][0][0] += f[x][1][0][1];
        f[e.to][1][1][0] += f[x][1][1][1];
        f[e.to][1][0][0] += f[x][1][1][1];
      }
      dfs(e.to, i);
    }
  }
  if (!flag) {
    if (a[x].k == 1) {
      h[now][1] = (0ll + f[x][0][0][1] + f[x][0][1][0] + f[x][1][0][1] +
                   f[x][1][1][0]) %
                  mod;
      h[now][0] = (0ll + f[x][0][1][1] + f[x][0][0][0] + f[x][1][0][0] +
                   f[x][1][1][1]) %
                  mod;
    } else {
      h[now][0] =
          (0ll + f[x][0][0][1] + f[x][0][1][1] + f[x][1][0][1] + f[x][1][1][1] +
           f[x][0][0][0] + f[x][0][1][1] + f[x][1][0][0] + f[x][1][1][1]) %
          mod;
      h[now][1] =
          (0ll + f[x][0][0][0] + f[x][0][1][0] + f[x][1][0][0] + f[x][1][1][0] +
           f[x][0][0][1] + f[x][0][1][0] + f[x][1][0][1] + f[x][1][1][0]) %
          mod;
    }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i].k);
    for (int j = 0; j < a[i].k; j++) {
      scanf("%d", &a[i].id[j]);
      if (appear[(int)fabs(a[i].id[j])]) {
        if (appear[(int)fabs(a[i].id[j])] != i)
          insert(appear[(int)fabs(a[i].id[j])], i, (int)fabs(a[i].id[j]));
        else {
          vis[i] = 1;
          tot++;
          if (a[i].id[0] == -a[i].id[1])
            h[tot][0] = 0, h[tot][1] = 2;
          else
            h[tot][0] = h[tot][1] = 1;
        }
        appear[(int)fabs(a[i].id[j])] = -1;
      } else
        appear[(int)fabs(a[i].id[j])] = i;
    }
  }
  for (int i = 1; i <= m; i++)
    if (appear[i] > 0 && a[appear[i]].k == 1) {
      vis[appear[i]] = 1;
      tot++;
      h[tot][0] = h[tot][1] = 1;
    }
  for (int i = 1; i <= n; i++)
    if (!vis[i]) tot++, findstart(i, 0);
  for (; top; top--) vis[sta[top]] = 0;
  for (int i = 1; i <= tot; i++)
    if (start[i]) now = i, dfs(start[i], 0);
  final[1][0] = h[1][0];
  final[1][1] = h[1][1];
  for (int i = 2; i <= tot; i++) {
    final[i][0] =
        (1ll * final[i - 1][1] * h[i][1] + 1ll * final[i - 1][0] * h[i][0]) %
        mod;
    final[i][1] =
        (1ll * final[i - 1][1] * h[i][0] + 1ll * final[i - 1][0] * h[i][1]) %
        mod;
  }
  for (int i = 1; i <= m; i++)
    if (appear[i] == 0) final[tot][1] = (final[tot][1] << 1) % mod;
  printf("%d\n", final[tot][1]);
  return 0;
}
