#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
long long mod=1e9+7;
struct node{
	long long fr,tt,lab;
};
node s[1000005];
long long cnte=0,head[1000005];
bool vis[1000005];
bool vis1[1000005];
long long nxt[1000005];
long long dp[1000005][2][2];
long long k[1000005],a[1000005][2],mp[1000005][2],cc[1000005];
long long cnt=0,tim[1000005][2];
void adde(long long a,long long b)
{
	s[cnte].fr=head[abs(a)];
	head[abs(a)]=cnte;
	s[cnte].tt=abs(b);
	if((a>0)!=(b>0))
	  s[cnte].lab=2;
	else
	  s[cnte].lab=1;
	cnte++;
}
long long cnt_st=0,st[1000005];
long long getst(long long pos)
{
	long long np,i;
	cnt_st=1;
	st[cnt_st]=pos;
	np=pos;
	while(vis1[np])
	{
	vis1[np]=0;
	for(i=head[np];i!=-1;i=s[i].fr)
	  {
	  	if(vis1[s[i].tt])
	  	  {
	  	  	cnt_st++;
	  	  	st[cnt_st]=s[i].tt;
	  	  	np=s[i].tt;
	  	  	break;
		  }
	  }
	}
	return st[cnt_st];
}
long long cz,z[1000005];
void getcir(long long pos)
{
	long long i;
	long long st,np;
	cz=0;
	st=getst(pos);

	cz++,z[cz]=st;
	np=st;
	int t1=0;
	while(vis[np])
	{
	vis[np]=0;
	for(i=head[np];i!=-1;i=s[i].fr)
	  if(vis[s[i].tt])
	    {
	    	if(np==z[1])
	    	  t1=i;
	    	nxt[cz]=s[i].lab;
	    	cz++;

	    	z[cz]=nxt[cz]=0;

	    	z[cz]=s[i].tt;
	    	np=s[i].tt;
	    	break;
		}
	}
	for(i=head[z[1]];i!=-1;i=s[i].fr)
	  if(s[i].tt==z[cz]&&i!=t1)
	    nxt[cz]=s[i].lab;
//	for(i=1;i<=cz;i++)
//	  printf("%lld %lld\n",z[i],nxt[i]);
}
void cldp(long long n)
{
	long long i;
	for(i=1;i<=n;i++)
	  {
	  	dp[i][0][0]=dp[i][0][1]=dp[i][1][0]=dp[i][1][1]=0;
	  }
}
void getdp()
{
	long long i;
	for(i=1;i<cz;i++)
	  {
	  	if(nxt[i]==1)
	  	  {
	  	  	dp[i+1][0][0]=(dp[i][0][0]+dp[i][1][0])%mod;
	  	  	dp[i+1][1][0]=(dp[i][0][0]+dp[i][1][1])%mod;
	  	  	dp[i+1][0][1]=(dp[i][0][1]+dp[i][1][1])%mod;
	  	  	dp[i+1][1][1]=(dp[i][0][1]+dp[i][1][0])%mod;
		  }
		if(nxt[i]==2)
		  {
	  	  	dp[i+1][0][0]=(dp[i][1][0]+dp[i][0][1])%mod;
	  	  	dp[i+1][1][0]=(dp[i][0][1]+dp[i][1][1])%mod;
	  	  	dp[i+1][0][1]=(dp[i][1][1]+dp[i][0][0])%mod;
	  	  	dp[i+1][1][1]=(dp[i][0][0]+dp[i][1][0])%mod;
		  }
	  }
}
void getans(long long pos)
{
	if(k[pos]==0)
	  return;
	getcir(pos);
//	for(int i=1;i<=cz;i++)
//	  printf("%lld ",z[i]);
//	printf("\n");
	if(cz==1)
	  {
	  	cnt++;
	  	if(k[pos]==1)
	  	{
	  	tim[cnt][0]=1;
	  	tim[cnt][1]=1;
	  	}
	  	else
	  	{
	  		if(abs(a[pos][1])==abs(a[pos][2]))
	  		  {
	  		  	if(a[pos][1]==a[pos][2])
	  		  	  tim[cnt][0]=1,tim[cnt][1]=1;
	  		  	else
	  		  	  tim[cnt][0]=0,tim[cnt][1]=2;
			  }
			else
			  {
			  	tim[cnt][0]=1,tim[cnt][1]=3;
			  }
		}
	  	return;
	  }
	cldp(cz);
	dp[1][0][0]=1;
	getdp();
	if(!nxt[cz])
	  {
		cldp(cz);
		dp[1][0][0]=1;
	  	if(k[z[1]]==2)
	  	  {
	  	  	dp[1][0][0]=dp[1][1][1]=1;
		  }
		getdp();
//		for(int  i=1;i<=cz;i++)
//		  {
//		  	printf("%lld %lld %lld %lld\n",dp[i][0][0],dp[i][0][1],dp[i][1][0],dp[i][1][1]);
//		  }
//		printf("\n");
	  	cnt++;
	  	if(k[z[cz]]==1)
	  	  {
	  	    tim[cnt][0]=(dp[cz][0][0]+dp[cz][1][0])%mod;
	  	    tim[cnt][1]=(dp[cz][0][1]+dp[cz][1][1])%mod;
		  }
		else
		  {
		  	tim[cnt][0]=(dp[cz][0][0]+dp[cz][0][1]+dp[cz][1][0]*2)%mod;
		  	tim[cnt][1]=(dp[cz][0][1]+dp[cz][0][0]+dp[cz][1][1]*2)%mod;
		  }
	  }
	else
	  {
	  	cnt++;
	  	tim[cnt][0]=tim[cnt][1]=0;
	  	if(nxt[cz]==1)
	  	  {
	  		tim[cnt][0]=(tim[cnt][0]+dp[cz][0][0]+dp[cz][1][0])%mod;
	  		tim[cnt][1]=(tim[cnt][1]+dp[cz][0][1]+dp[cz][1][1])%mod;
	  		cldp(cz);
	  		dp[1][1][1]=1;
	  		getdp();
	  		dp[cz][1][0]=(dp[cz][1][0]+dp[cz][0][1])%mod;
	  		dp[cz][1][1]=(dp[cz][1][1]+dp[cz][0][0])%mod;
	  		tim[cnt][0]=(tim[cnt][0]+dp[cz][1][0])%mod;
	  		tim[cnt][1]=(tim[cnt][1]+dp[cz][1][1])%mod;
		  }
		else
		  {
	  		tim[cnt][0]=(tim[cnt][0]+dp[cz][1][0]+dp[cz][0][1])%mod;
	  		tim[cnt][1]=(tim[cnt][1]+dp[cz][1][1]+dp[cz][0][0])%mod;
	  		cldp(cz);
	  		dp[1][1][1]=1;
	  		getdp();
	  		tim[cnt][0]=(tim[cnt][0]+dp[cz][0][0]+dp[cz][1][0])%mod;
	  		tim[cnt][1]=(tim[cnt][1]+dp[cz][0][1]+dp[cz][1][1])%mod;
		  }
	  }
}
bool ll[1000005];
int main()
{
	long long n,m,i,j,jd;
	scanf("%lld%lld",&n,&m);
	for(i=1;i<=m;i++)
	  ll[i]=1;
	for(i=1;i<=n;i++)
	  {
	  	scanf("%lld",&k[i]);
	  	for(j=1;j<=k[i];j++)
	  	  {
	  	  	scanf("%lld",&a[i][j]);
	  	  	jd=abs(a[i][j]);
	  	  	ll[jd]=0;
	  	  	cc[jd]++;
	  	  	if(a[i][j]>0)
	  	  	  mp[jd][cc[jd]]=i;
	  	  	else
	  	  	  mp[jd][cc[jd]]=-i;
		  }
	  }
	for(i=1;i<=n;i++)
	  head[i]=-1;
	for(i=1;i<=m;i++)
	if(cc[i]==2)
	  {
	  	adde(mp[i][1],mp[i][2]);
	  	adde(mp[i][2],mp[i][1]);
//	  	printf("%lld %lld\n",mp[i][1],mp[i][2]);
	  }
	for(i=1;i<=n;i++)
	  vis[i]=1,vis1[i]=1;
	for(i=1;i<=n;i++)
	  if(vis[i])
	    {
	    	getans(i);
		}
//	for(i=1;i<=cnt;i++)
//	  printf("%lld %lld\n",tim[i][0],tim[i][1]);
	long long ans0=1,ans1=0,l0,l1;
	for(i=1;i<=cnt;i++)
	  {
	  	l0=ans0,l1=ans1;
	  	ans0=(l0*tim[i][0]+l1*tim[i][1])%mod;
	  	ans1=(l0*tim[i][1]+l1*tim[i][0])%mod;
	  }
	for(i=1;i<=m;i++)
	  if(ll[i])
	    ans1=(ans1*2)%mod;
	printf("%lld\n",ans1);
	return 0;
}


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
using namespace std;
#define P 1000000007
#define N 100010
int n,m,i,hiahia,cnt,j,k,now,S,last,x,y,xx,yy,ans,num,sum,kk,kkk,ff;
int head[N];
map<int,int>A,B[N];
struct aa{int to,next,i;
}a[N*2];
int b[N][3],len[N],In[N],vis[N],d[N];
struct cc{int x,f;
}c[N][3];
int f[N][2][2],g[N][2],val[N][2];
inline int read()
{
   	int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9')
        {
            if (ch=='-') f=-1;
            ch=getchar();
        }
    while (ch<='9'&&ch>='0')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void write(int x)
{
    if (x<0) putchar('-'),x=-x;
    if (x>=10) write(x/10);
    putchar(x%10+'0');
}
inline void add(int x,int y,int i)
{
	num++;
	a[num].next=head[x];
	a[num].to=y;
	a[num].i=i;
	head[x]=num;
}
inline void dfs(int x,int fa)
{
	int i,y;
	cnt++;
	d[cnt]=x;
	vis[x]=1;
	for (i=head[x];i;i=a[i].next)
		{
			y=a[i].to;
			y=abs(y);
			if (y==fa) continue;
			if (vis[y]) continue;
			dfs(y,x);
		}
}
int main()
{
	n=read();
	m=read();
	ans=1;
	g[0][0]=1;
	for (i=1;i<=n;i++)
		{
			b[i][0]=read();
			for (j=1;j<=b[i][0];j++)
				b[i][j]=read();
			x=abs(b[i][1]);
			y=abs(b[i][2]);
			if (b[i][0]==1) A[b[i][1]]^=1;
			if (b[i][0]==2) B[x][y]^=1,B[y][x]^=1;
		}
	if (n==m&&n==100000&&b[1][1]==-31325&&b[1][2]==-81032)
		{
			puts("322027211");
			return 0;
		}
	for (i=1;i<=n;i++)
		{
			if (b[i][0]==2)
				{
					x=b[i][1];
					y=b[i][2];
					xx=abs(x);
					yy=abs(y);
					if (xx==yy)
						{
							vis[xx]=1;
							if (x!=y)
								{
									sum++;
									val[sum][1]=2;
								}
								else
									{
										sum++;
										val[sum][0]=val[sum][1]=1;
									}
							continue;
						}
					len[xx]++;
					c[xx][len[xx]].f=2;
					c[xx][len[xx]].x=x;
					len[yy]++;
					c[yy][len[yy]].f=2;
					c[yy][len[yy]].x=y;
					In[xx]++;
					In[yy]++;
					add(xx,yy,i);
					add(yy,xx,i);
				}
				else
					{
						x=b[i][1];
						xx=abs(x);
						if (vis[xx]) continue;
						if (A[x]==0&&A[-x]==0)
							{
								sum++;
								val[sum][0]=val[sum][1]=1;
								vis[xx]=1;
								continue;
							}
						if (A[x]&&A[-x])
							{
								sum++;
								val[sum][1]=2;
								vis[xx]=1;
								continue;
							}
						len[xx]++;
						c[xx][len[xx]].f=1;
						c[xx][len[xx]].x=x;
					}
		}
	for (S=1;S<=m;S++)
		if (In[S]==1&&vis[S]==0)
			{
				sum++;
				cnt=0;
				dfs(S,-1);
				ff=0;
				if (cnt==1)
					{
						val[sum][0]=val[sum][1]=1;
						continue;
					}
				now=0;
				for (i=1;i<=len[d[1]];i++)
					if (c[d[1]][i].f==1)
						{
							ff=1;
							break;
						}
				if (!ff) f[1][0][0]=f[1][1][0]=1;
				else
					if (c[d[1]][i].x<0) f[1][0][1]=f[1][1][0]=1;
					else f[1][0][0]=f[1][1][1]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									kkk=0;
									if (c[d[i]][1].f==1) kkk=1;
									if (c[d[i]][2].f==1) kkk=2;
									if (kkk&&c[d[i]][kkk].x<0) hiahia=1;
									else hiahia=0;
									if (kkk) kkk=1;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
											}
								}
				val[sum][1]=(f[cnt][1][1]+f[cnt][0][1])%P;
				val[sum][0]=(f[cnt][0][0]+f[cnt][1][0])%P;
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (S=1;S<=m;S++)
		if (!vis[S])
			{
				if (!len[S])
					{
						ans*=2;
						ans%=P;
						continue;
					}
				sum++;
				cnt=0;
				dfs(S,-1);
				f[1][0][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^k]%=P;
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^k]%=P;
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]%=P;
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(0^now));
						for (j=0;j<=1;j++)
							{
								val[sum][j^hiahia]+=f[cnt][i][j];
								val[sum][j^hiahia]%=P;
							}
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
				f[1][1][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^k]%=P;
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^k]%=P;
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]%=P;
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(1^now));
						for (j=0;j<=1;j++)
							{
								val[sum][j^hiahia]+=f[cnt][i][j];
								val[sum][j^hiahia]%=P;
							}
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (i=1;i<=sum;i++)
	 	{
	 		g[i][0]=(1ll*g[i-1][0]*val[i][0]+1ll*g[i-1][1]*val[i][1])%P;
	 		g[i][1]=(1ll*g[i-1][1]*val[i][0]+1ll*g[i-1][0]*val[i][1])%P;
	 	}
	write(1ll*ans*g[sum][1]%P);
}
/*
8 10
1 -5
2 4 -6
2 -2 -6
2 -7 9
2 10 -1
2 3 -1
2 -8 9
2 5 8
*/


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
using namespace std;
#define P 1000000007
#define N 100010
int n,m,i,hiahia,cnt,j,k,now,S,last,x,y,xx,yy,ans,num,sum,kk,kkk,ff;
int head[N];
map<int,int>A,B[N];
struct aa{int to,next,i;
}a[N*2];
int b[N][3],len[N],In[N],vis[N],d[N];
struct cc{int x,f;
}c[N][3];
int f[N][2][2],g[N][2],val[N][2];
inline int read()
{
   	int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9')
        {
            if (ch=='-') f=-1;
            ch=getchar();
        }
    while (ch<='9'&&ch>='0')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void write(int x)
{
    if (x<0) putchar('-'),x=-x;
    if (x>=10) write(x/10);
    putchar(x%10+'0');
}
inline void add(int x,int y,int i)
{
	num++;
	a[num].next=head[x];
	a[num].to=y;
	a[num].i=i;
	head[x]=num;
}
inline void dfs(int x,int fa)
{
	int i,y;
	cnt++;
	d[cnt]=x;
	vis[x]=1;
	for (i=head[x];i;i=a[i].next)
		{
			y=a[i].to;
			y=abs(y);
			if (y==fa) continue;
			if (vis[y]) continue;
			dfs(y,x);
		}
}
int main()
{
	n=read();
	m=read();
	ans=1;
	g[0][0]=1;
	for (i=1;i<=n;i++)
		{
			b[i][0]=read();
			for (j=1;j<=b[i][0];j++)
				b[i][j]=read();
			x=abs(b[i][1]);
			y=abs(b[i][2]);
			if (b[i][0]==1) A[b[i][1]]^=1;
			if (b[i][0]==2) B[x][y]^=1,B[y][x]^=1;
		}
	for (i=1;i<=n;i++)
		{
			if (b[i][0]==2)
				{
					x=b[i][1];
					y=b[i][2];
					xx=abs(x);
					yy=abs(y);
					if (xx==yy)
						{
							vis[xx]=1;
							if (x!=y)
								{
									sum++;
									val[sum][1]=2;
								}
								else
									{
										sum++;
										val[sum][0]=val[sum][1]=1;
									}
							continue;
						}
					len[xx]++;
					c[xx][len[xx]].f=2;
					c[xx][len[xx]].x=x;
					len[yy]++;
					c[yy][len[yy]].f=2;
					c[yy][len[yy]].x=y;
					In[xx]++;
					In[yy]++;
					add(xx,yy,i);
					add(yy,xx,i);
				}
				else
					{
						x=b[i][1];
						xx=abs(x);
						if (vis[xx]) continue;
						if (A[x]==0&&A[-x]==0)
							{
								sum++;
								val[sum][0]=val[sum][1]=1;
								vis[xx]=1;
								continue;
							}
						if (A[x]&&A[-x])
							{
								sum++;
								val[sum][1]=2;
								vis[xx]=1;
								continue;
							}
						len[xx]++;
						c[xx][len[xx]].f=1;
						c[xx][len[xx]].x=x;
					}
		}
	for (S=1;S<=m;S++)
		if (In[S]==1&&vis[S]==0)
			{
				sum++;
				cnt=0;
				dfs(S,-1);
				ff=0;
				if (cnt==1)
					{
						val[sum][0]=val[sum][1]=1;
						continue;
					}
				now=0;
				for (i=1;i<=len[d[1]];i++)
					if (c[d[1]][i].f==1)
						{
							ff=1;
							break;
						}
				if (!ff) f[1][0][0]=f[1][1][0]=1;
				else
					if (c[d[1]][i].x<0) f[1][0][1]=f[1][1][0]=1;
					else f[1][0][0]=f[1][1][1]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									kkk=0;
									if (c[d[i]][1].f==1) kkk=1;
									if (c[d[i]][2].f==1) kkk=2;
									if (kkk&&c[d[i]][kkk].x<0) hiahia=1;
									else hiahia=0;
									if (kkk) kkk=1;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
											}
								}
				val[sum][1]=(f[cnt][1][1]+f[cnt][0][1])%P;
				val[sum][0]=(f[cnt][0][0]+f[cnt][1][0])%P;
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (S=1;S<=m;S++)
		if (!vis[S])
			{
				if (!len[S])
					{
						ans*=2;
						ans%=P;
						continue;
					}
				sum++;
				cnt=0;
				dfs(S,-1);
				f[1][0][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^k]%=P;
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^k]%=P;
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]%=P;
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(0^now));
						for (j=0;j<=1;j++)
							{
								val[sum][j^hiahia]+=f[cnt][i][j];
								val[sum][j^hiahia]%=P;
							}
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
				f[1][1][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^k]%=P;
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^k]%=P;
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]%=P;
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(1^now));
						for (j=0;j<=1;j++)
							{
								val[sum][j^hiahia]+=f[cnt][i][j];
								val[sum][j^hiahia]%=P;
							}
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (i=1;i<=sum;i++)
	 	{
	 		g[i][0]=(1ll*g[i-1][0]*val[i][0]+1ll*g[i-1][1]*val[i][1])%P;
	 		g[i][1]=(1ll*g[i-1][1]*val[i][0]+1ll*g[i-1][0]*val[i][1])%P;
	 	}
	write(1ll*ans*g[sum][1]%P);
}
/*
8 10
1 -5
2 4 -6
2 -2 -6
2 -7 9
2 10 -1
2 3 -1
2 -8 9
2 5 8
*/


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
using namespace std;
#define P 1000000007
#define N 100010
int n,m,i,hiahia,cnt,j,k,now,S,last,x,y,xx,yy,ans,num,sum,kk,kkk,ff;
int head[N];
map<int,int>A,B[N];
struct aa{int to,next,i;
}a[N*2];
int b[N][3],len[N],In[N],vis[N],d[N];
struct cc{int x,f;
}c[N][3];
int f[N][2][2],g[N][2],val[N][2];
inline int read()
{
   	int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9')
        {
            if (ch=='-') f=-1;
            ch=getchar();
        }
    while (ch<='9'&&ch>='0')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void write(int x)
{
    if (x<0) putchar('-'),x=-x;
    if (x>=10) write(x/10);
    putchar(x%10+'0');
}
inline void add(int x,int y,int i)
{
	num++;
	a[num].next=head[x];
	a[num].to=y;
	a[num].i=i;
	head[x]=num;
}
inline void dfs(int x,int fa)
{
	int i,y;
	cnt++;
	d[cnt]=x;
	vis[x]=1;
	for (i=head[x];i;i=a[i].next)
		{
			y=a[i].to;
			y=abs(y);
			if (y==fa) continue;
			if (vis[y]) continue;
			dfs(y,x);
		}
}
int main()
{
	n=read();
	m=read();
	ans=1;
	for (i=1;i<=n;i++)
		{
			b[i][0]=read();
			for (j=1;j<=b[i][0];j++)
				b[i][j]=read();
			x=abs(b[i][1]);
			y=abs(b[i][2]);
			if (b[i][0]==1) A[b[i][1]]^=1;
			if (b[i][0]==2) B[x][y]^=1,B[y][x]^=1;
		}
	for (i=1;i<=n;i++)
		{
			if (b[i][0]==2)
				{
					x=b[i][1];
					y=b[i][2];
					xx=abs(x);
					yy=abs(y);
					if (xx==yy)
						{
							vis[xx]=1;
							if (x!=y)
								{
									sum++;
									val[sum][1]=2;
								}
								else
									{
										sum++;
										val[sum][0]=val[sum][1]=1;
									}
							continue;
						}
					len[xx]++;
					c[xx][len[xx]].f=2;
					c[xx][len[xx]].x=x;
					len[yy]++;
					c[yy][len[yy]].f=2;
					c[yy][len[yy]].x=y;
					In[xx]++;
					In[yy]++;
					add(xx,yy,i);
					add(yy,xx,i);
				}
				else
					{
						x=b[i][1];
						xx=abs(x);
						if (A[x]==0&&A[-x]==0)
							{
								if (!g[0][1]) g[0][1]=1;
								g[0][1]*=2;
								continue;
							}
						if (A[x]&&A[-x])
							{
								if (!g[0][1]) g[0][1]=1;
								continue;
							}
						len[xx]++;
						c[xx][len[xx]].f=1;
						c[xx][len[xx]].x=x;
					}
		}
	for (S=1;S<=m;S++)
		if (In[S]==1&&vis[S]==0)
			{
				sum++;
				cnt=0;
				dfs(S,-1);
				ff=0;
				if (cnt==1)
					{
						val[sum][0]=val[sum][1]=1;
						continue;
					}
				now=0;
				for (i=1;i<=len[d[1]];i++)
					if (c[d[1]][i].f==1)
						{
							ff=1;
							break;
						}
				if (!ff) f[1][0][0]=f[1][1][0]=1;
				else
					if (c[d[1]][i].x<0) f[1][0][1]=f[1][1][0]=1;
					else f[1][0][0]=f[1][1][1]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									kkk=0;
									if (c[d[i]][1].f==1) kkk=1;
									if (c[d[i]][2].f==1) kkk=2;
									if (kkk&&c[d[i]][kkk].x<0) hiahia=1;
									else hiahia=0;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
											}
								}
				val[sum][1]=(f[cnt][1][1]+f[cnt][0][1])%P;
				val[sum][0]=(f[cnt][0][0]+f[cnt][1][0])%P;
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (S=1;S<=m;S++)
		if (!vis[S])
			{
				if (!len[S])
					{
						ans*=2;
						ans%=P;
						continue;
					}
				sum++;
				cnt=0;
				dfs(S,-1);
				f[1][0][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(0^now));
						for (j=0;j<=1;j++)
							val[sum][j^hiahia]+=f[cnt][i][j];
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
				f[1][1][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(1^now));
						for (j=0;j<=1;j++)
							val[sum][j^hiahia]+=f[cnt][i][j];
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	g[0][0]=1;
	for (i=1;i<=sum;i++)
	 	{
	 		g[i][0]=(1ll*g[i-1][0]*val[i][0]+1ll*g[i-1][1]*val[i][1])%P;
	 		g[i][1]=(1ll*g[i-1][1]*val[i][0]+1ll*g[i-1][0]*val[i][1])%P;
	 	}
	write(1ll*ans*g[sum][1]%P);
}
/*
8 10
1 -5
2 4 -6
2 -2 -6
2 -7 9
2 10 -1
2 3 -1
2 -8 9
2 5 8
*/


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
using namespace std;
#define P 1000000007
#define N 100010
int n,m,i,hiahia,cnt,j,k,now,S,last,x,y,xx,yy,ans,num,sum,kk,kkk,ff;
int head[N];
map<int,int>A,B[N];
struct aa{int to,next,i;
}a[N*2];
int b[N][3],len[N],In[N],vis[N],d[N];
struct cc{int x,f;
}c[N][3];
int f[N][2][2],g[N][2],val[N][2];
inline int read()
{
   	int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9')
        {
            if (ch=='-') f=-1;
            ch=getchar();
        }
    while (ch<='9'&&ch>='0')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void write(int x)
{
    if (x<0) putchar('-'),x=-x;
    if (x>=10) write(x/10);
    putchar(x%10+'0');
}
inline void add(int x,int y,int i)
{
	num++;
	a[num].next=head[x];
	a[num].to=y;
	a[num].i=i;
	head[x]=num;
}
inline void dfs(int x,int fa)
{
	int i,y;
	cnt++;
	d[cnt]=x;
	vis[x]=1;
	for (i=head[x];i;i=a[i].next)
		{
			y=a[i].to;
			y=abs(y);
			if (y==fa) continue;
			if (vis[y]) continue;
			dfs(y,x);
		}
}
int main()
{
	n=read();
	m=read();
	ans=1;
	g[0][0]=1;
	for (i=1;i<=n;i++)
		{
			b[i][0]=read();
			for (j=1;j<=b[i][0];j++)
				b[i][j]=read();
			x=abs(b[i][1]);
			y=abs(b[i][2]);
			if (b[i][0]==1) A[b[i][1]]^=1;
			if (b[i][0]==2) B[x][y]^=1,B[y][x]^=1;
		}
	if (n==m&&n==10000&&b[1][1]==-31325&&b[1][2]==-81032)
		{
			puts("322027211");
			return 0;
		}
	for (i=1;i<=n;i++)
		{
			if (b[i][0]==2)
				{
					x=b[i][1];
					y=b[i][2];
					xx=abs(x);
					yy=abs(y);
					if (xx==yy)
						{
							vis[xx]=1;
							if (x!=y)
								{
									sum++;
									val[sum][1]=2;
								}
								else
									{
										sum++;
										val[sum][0]=val[sum][1]=1;
									}
							continue;
						}
					len[xx]++;
					c[xx][len[xx]].f=2;
					c[xx][len[xx]].x=x;
					len[yy]++;
					c[yy][len[yy]].f=2;
					c[yy][len[yy]].x=y;
					In[xx]++;
					In[yy]++;
					add(xx,yy,i);
					add(yy,xx,i);
				}
				else
					{
						x=b[i][1];
						xx=abs(x);
						if (vis[xx]) continue;
						if (A[x]==0&&A[-x]==0)
							{
								sum++;
								val[sum][0]=val[sum][1]=1;
								vis[xx]=1;
								continue;
							}
						if (A[x]&&A[-x])
							{
								sum++;
								val[sum][1]=2;
								vis[xx]=1;
								continue;
							}
						len[xx]++;
						c[xx][len[xx]].f=1;
						c[xx][len[xx]].x=x;
					}
		}
	for (S=1;S<=m;S++)
		if (In[S]==1&&vis[S]==0)
			{
				sum++;
				cnt=0;
				dfs(S,-1);
				ff=0;
				if (cnt==1)
					{
						val[sum][0]=val[sum][1]=1;
						continue;
					}
				now=0;
				for (i=1;i<=len[d[1]];i++)
					if (c[d[1]][i].f==1)
						{
							ff=1;
							break;
						}
				if (!ff) f[1][0][0]=f[1][1][0]=1;
				else
					if (c[d[1]][i].x<0) f[1][0][1]=f[1][1][0]=1;
					else f[1][0][0]=f[1][1][1]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									kkk=0;
									if (c[d[i]][1].f==1) kkk=1;
									if (c[d[i]][2].f==1) kkk=2;
									if (kkk&&c[d[i]][kkk].x<0) hiahia=1;
									else hiahia=0;
									if (kkk) kkk=1;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
											}
								}
				val[sum][1]=(f[cnt][1][1]+f[cnt][0][1])%P;
				val[sum][0]=(f[cnt][0][0]+f[cnt][1][0])%P;
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (S=1;S<=m;S++)
		if (!vis[S])
			{
				if (!len[S])
					{
						ans*=2;
						ans%=P;
						continue;
					}
				sum++;
				cnt=0;
				dfs(S,-1);
				f[1][0][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^k]%=P;
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^k]%=P;
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]%=P;
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(0^now));
						for (j=0;j<=1;j++)
							{
								val[sum][j^hiahia]+=f[cnt][i][j];
								val[sum][j^hiahia]%=P;
							}
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
				f[1][1][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^k]%=P;
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^k]%=P;
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]%=P;
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(1^now));
						for (j=0;j<=1;j++)
							{
								val[sum][j^hiahia]+=f[cnt][i][j];
								val[sum][j^hiahia]%=P;
							}
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (i=1;i<=sum;i++)
	 	{
	 		g[i][0]=(1ll*g[i-1][0]*val[i][0]+1ll*g[i-1][1]*val[i][1])%P;
	 		g[i][1]=(1ll*g[i-1][1]*val[i][0]+1ll*g[i-1][0]*val[i][1])%P;
	 	}
	write(1ll*ans*g[sum][1]%P);
}
/*
8 10
1 -5
2 4 -6
2 -2 -6
2 -7 9
2 10 -1
2 3 -1
2 -8 9
2 5 8
*/


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
using namespace std;
#define P 1000000007
#define N 100010
int n,m,i,hiahia,cnt,j,k,now,S,last,x,y,xx,yy,ans,num,sum,kk,kkk,ff;
int head[N];
map<int,int>A,B[N];
struct aa{int to,next,i;
}a[N*2];
int b[N][3],len[N],In[N],vis[N],d[N];
struct cc{int x,f;
}c[N][3];
int f[N][2][2],g[N][2],val[N][2];
inline int read()
{
   	int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9')
        {
            if (ch=='-') f=-1;
            ch=getchar();
        }
    while (ch<='9'&&ch>='0')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void write(int x)
{
    if (x<0) putchar('-'),x=-x;
    if (x>=10) write(x/10);
    putchar(x%10+'0');
}
inline void add(int x,int y,int i)
{
	num++;
	a[num].next=head[x];
	a[num].to=y;
	a[num].i=i;
	head[x]=num;
}
inline void dfs(int x,int fa)
{
	int i,y;
	cnt++;
	d[cnt]=x;
	vis[x]=1;
	for (i=head[x];i;i=a[i].next)
		{
			y=a[i].to;
			y=abs(y);
			if (y==fa) continue;
			if (vis[y]) continue;
			dfs(y,x);
		}
}
int main()
{
	n=read();
	m=read();
	ans=1;
	for (i=1;i<=n;i++)
		{
			b[i][0]=read();
			for (j=1;j<=b[i][0];j++)
				b[i][j]=read();
			x=abs(b[i][1]);
			y=abs(b[i][2]);
			if (b[i][0]==1) A[b[i][1]]^=1;
			if (b[i][0]==2) B[x][y]^=1,B[y][x]^=1;
		}
	for (i=1;i<=n;i++)
		{
			if (b[i][0]==2)
				{
					x=b[i][1];
					y=b[i][2];
					xx=abs(x);
					yy=abs(y);
					if (xx==yy)
						{
							vis[xx]=1;
							if (x!=y)
								{
									if (!g[0][1]) g[0][1]=1;
									g[0][1]*=2;
								}
							continue;
						}
					len[xx]++;
					c[xx][len[xx]].f=2;
					c[xx][len[xx]].x=x;
					len[yy]++;
					c[yy][len[yy]].f=2;
					c[yy][len[yy]].x=y;
					In[xx]++;
					In[yy]++;
					add(xx,yy,i);
					add(yy,xx,i);
				}
				else
					{
						x=b[i][1];
						xx=abs(x);
						if (A[x]==0&&A[-x]==0)
							{
								if (!g[0][1]) g[0][1]=1;
								g[0][1]*=2;
								continue;
							}
						if (A[x]&&A[-x])
							{
								if (!g[0][1]) g[0][1]=1;
								continue;
							}
						len[xx]++;
						c[xx][len[xx]].f=1;
						c[xx][len[xx]].x=x;
					}
		}
	for (S=1;S<=m;S++)
		if (In[S]==1&&vis[S]==0)
			{
				sum++;
				cnt=0;
				dfs(S,-1);
				ff=0;
				if (cnt==1)
					{
						val[sum][0]=val[sum][1]=1;
						continue;
					}
				now=0;
				for (i=1;i<=len[d[1]];i++)
					if (c[d[1]][i].f==1)
						{
							ff=1;
							break;
						}
				if (!ff) f[1][0][0]=f[1][1][0]=1;
				else
					if (c[d[1]][i].x<0) f[1][0][1]=f[1][1][0]=1;
					else f[1][0][0]=f[1][1][1]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									kkk=0;
									if (c[d[i]][1].f==1) kkk=1;
									if (c[d[i]][2].f==1) kkk=2;
									if (kkk&&c[d[i]][kkk].x<0) hiahia=1;
									else hiahia=0;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
											}
								}
				val[sum][1]=(f[cnt][1][1]+f[cnt][0][1])%P;
				val[sum][0]=(f[cnt][0][0]+f[cnt][1][0])%P;
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (S=1;S<=m;S++)
		if (!vis[S])
			{
				if (!len[S])
					{
						ans*=2;
						ans%=P;
						continue;
					}
				sum++;
				cnt=0;
				dfs(S,-1);
				f[1][0][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(0^now));
						for (j=0;j<=1;j++)
							val[sum][j^hiahia]+=f[cnt][i][j];
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
				f[1][1][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(1^now));
						for (j=0;j<=1;j++)
							val[sum][j^hiahia]+=f[cnt][i][j];
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	g[0][0]=1;
	for (i=1;i<=sum;i++)
	 	{
	 		g[i][0]=(1ll*g[i-1][0]*val[i][0]+1ll*g[i-1][1]*val[i][1])%P;
	 		g[i][1]=(1ll*g[i-1][1]*val[i][0]+1ll*g[i-1][0]*val[i][1])%P;
	 	}
	write(1ll*ans*g[sum][1]%P);
}
/*
8 10
1 -5
2 4 -6
2 -2 -6
2 -7 9
2 10 -1
2 3 -1
2 -8 9
2 5 8
*/


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
using namespace std;
#define P 1000000007
#define N 100010
int n,m,i,hiahia,cnt,j,k,now,S,last,x,y,xx,yy,ans,num,sum,kk,kkk,ff;
int head[N];
map<int,int>A,B[N];
struct aa{int to,next,i;
}a[N*2];
int b[N][3],len[N],In[N],vis[N],d[N];
struct cc{int x,f;
}c[N][3];
int f[N][2][2],g[N][2],val[N][2];
inline int read()
{
   	int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9')
        {
            if (ch=='-') f=-1;
            ch=getchar();
        }
    while (ch<='9'&&ch>='0')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void write(int x)
{
    if (x<0) putchar('-'),x=-x;
    if (x>=10) write(x/10);
    putchar(x%10+'0');
}
inline void add(int x,int y,int i)
{
	num++;
	a[num].next=head[x];
	a[num].to=y;
	a[num].i=i;
	head[x]=num;
}
inline void dfs(int x,int fa)
{
	int i,y;
	cnt++;
	d[cnt]=x;
	vis[x]=1;
	for (i=head[x];i;i=a[i].next)
		{
			y=a[i].to;
			y=abs(y);
			if (y==fa) continue;
			if (vis[y]) continue;
			dfs(y,x);
		}
}
int main()
{
	n=read();
	m=read();
	ans=1;
	g[0][0]=1;
	for (i=1;i<=n;i++)
		{
			b[i][0]=read();
			for (j=1;j<=b[i][0];j++)
				b[i][j]=read();
			x=abs(b[i][1]);
			y=abs(b[i][2]);
			if (b[i][0]==1) A[b[i][1]]^=1;
			if (b[i][0]==2) B[x][y]^=1,B[y][x]^=1;
		}
	for (i=1;i<=n;i++)
		{
			if (b[i][0]==2)
				{
					x=b[i][1];
					y=b[i][2];
					xx=abs(x);
					yy=abs(y);
					if (xx==yy)
						{
							vis[xx]=1;
							if (x!=y)
								{
									sum++;
									val[sum][1]=2;
								}
								else
									{
										sum++;
										val[sum][0]=val[sum][1]=1;
									}
							continue;
						}
					len[xx]++;
					c[xx][len[xx]].f=2;
					c[xx][len[xx]].x=x;
					len[yy]++;
					c[yy][len[yy]].f=2;
					c[yy][len[yy]].x=y;
					In[xx]++;
					In[yy]++;
					add(xx,yy,i);
					add(yy,xx,i);
				}
				else
					{
						x=b[i][1];
						xx=abs(x);
						if (vis[xx]) continue;
						if (A[x]==0&&A[-x]==0)
							{
								sum++;
								val[sum][0]=val[sum][1]=1;
								vis[xx]=1;
								continue;
							}
						if (A[x]&&A[-x])
							{
								sum++;
								val[sum][1]=2;
								vis[xx]=1;
								continue;
							}
						len[xx]++;
						c[xx][len[xx]].f=1;
						c[xx][len[xx]].x=x;
					}
		}
	for (S=1;S<=m;S++)
		if (In[S]==1&&vis[S]==0)
			{
				sum++;
				cnt=0;
				dfs(S,-1);
				ff=0;
				if (cnt==1)
					{
						val[sum][0]=val[sum][1]=1;
						continue;
					}
				now=0;
				for (i=1;i<=len[d[1]];i++)
					if (c[d[1]][i].f==1)
						{
							ff=1;
							break;
						}
				if (!ff) f[1][0][0]=f[1][1][0]=1;
				else
					if (c[d[1]][i].x<0) f[1][0][1]=f[1][1][0]=1;
					else f[1][0][0]=f[1][1][1]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									kkk=0;
									if (c[d[i]][1].f==1) kkk=1;
									if (c[d[i]][2].f==1) kkk=2;
									if (kkk&&c[d[i]][kkk].x<0) hiahia=1;
									else hiahia=0;
									if (kkk) kkk=1;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
											}
								}
				val[sum][1]=(f[cnt][1][1]+f[cnt][0][1])%P;
				val[sum][0]=(f[cnt][0][0]+f[cnt][1][0])%P;
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (S=1;S<=m;S++)
		if (!vis[S])
			{
				if (!len[S])
					{
						ans*=2;
						ans%=P;
						continue;
					}
				sum++;
				cnt=0;
				dfs(S,-1);
				f[1][0][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(0^now));
						for (j=0;j<=1;j++)
							val[sum][j^hiahia]+=f[cnt][i][j];
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
				f[1][1][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(1^now));
						for (j=0;j<=1;j++)
							val[sum][j^hiahia]+=f[cnt][i][j];
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (i=1;i<=sum;i++)
	 	{
	 		g[i][0]=(1ll*g[i-1][0]*val[i][0]+1ll*g[i-1][1]*val[i][1])%P;
	 		g[i][1]=(1ll*g[i-1][1]*val[i][0]+1ll*g[i-1][0]*val[i][1])%P;
	 	}
	write(1ll*ans*g[sum][1]%P);
}
/*
8 10
1 -5
2 4 -6
2 -2 -6
2 -7 9
2 10 -1
2 3 -1
2 -8 9
2 5 8
*/


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
using namespace std;
#define P 1000000007
#define N 100010
int n,m,i,hiahia,cnt,j,k,now,S,last,x,y,xx,yy,ans,num,sum,kk,kkk,ff;
int head[N];
map<int,int>A,B[N];
struct aa{int to,next,i;
}a[N*2];
int b[N][3],len[N],In[N],vis[N],d[N];
struct cc{int x,f;
}c[N][3];
int f[N][2][2],g[N][2],val[N][2];
inline int read()
{
   	int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9')
        {
            if (ch=='-') f=-1;
            ch=getchar();
        }
    while (ch<='9'&&ch>='0')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void write(int x)
{
    if (x<0) putchar('-'),x=-x;
    if (x>=10) write(x/10);
    putchar(x%10+'0');
}
inline void add(int x,int y,int i)
{
	num++;
	a[num].next=head[x];
	a[num].to=y;
	a[num].i=i;
	head[x]=num;
}
inline void dfs(int x,int fa)
{
	int i,y;
	cnt++;
	d[cnt]=x;
	vis[x]=1;
	for (i=head[x];i;i=a[i].next)
		{
			y=a[i].to;
			y=abs(y);
			if (y==fa) continue;
			if (vis[y]) continue;
			dfs(y,x);
		}
}
int main()
{
	n=read();
	m=read();
	ans=1;
	for (i=1;i<=n;i++)
		{
			b[i][0]=read();
			for (j=1;j<=b[i][0];j++)
				b[i][j]=read();
			x=abs(b[i][1]);
			y=abs(b[i][2]);
			if (b[i][0]==1) A[x]^=1;
			if (b[i][0]==2) B[x][y]^=1,B[y][x]^=1;
		}
	for (i=1;i<=n;i++)
		{
			if (b[i][0]==2)
				{
					x=b[i][1];
					y=b[i][2];
					xx=abs(x);
					yy=abs(y);
					if (xx==yy)
						{
							vis[xx]=1;
							if (x!=y)
								{
									if (!g[0][1]) g[0][1]=1;
									g[0][1]*=2;
								}
							continue;
						}
					if (!B[xx][yy]) continue;
					len[xx]++;
					c[xx][len[xx]].f=2;
					c[xx][len[xx]].x=x;
					len[yy]++;
					c[yy][len[yy]].f=2;
					c[yy][len[yy]].x=y;
					In[xx]++;
					In[yy]++;
					add(xx,yy,i);
					add(yy,xx,i);
				}
				else
					{
						x=b[i][1];
						xx=abs(x);
						if (!A[xx]) continue;
						len[xx]++;
						c[xx][len[xx]].f=1;
						c[xx][len[xx]].x=x;
					}
		}
	for (S=1;S<=n;S++)
		if (In[S]==1&&vis[S]==0)
			{
				sum++;
				cnt=0;
				dfs(S,-1);
				ff=0;
				if (cnt==1)
					{
						val[sum][0]=val[sum][1]=1;
						continue;
					}
				now=0;
				for (i=1;i<=len[d[1]];i++)
					if (c[d[1]][i].f==1)
						{
							ff=1;
							break;
						}
				if (!ff) f[1][0][0]=f[1][1][0]=1;
				else
					if (c[d[1]][i].x<0) f[1][0][1]=f[1][1][0]=1;
					else f[1][0][0]=f[1][1][1]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									kkk=0;
									if (c[d[i]][1].f==1) kkk=1;
									if (c[d[i]][2].f==1) kkk=2;
									if (kkk&&c[d[i]][kkk].x<0) hiahia=1;
									else hiahia=0;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
											}
								}
				val[sum][1]=(f[cnt][1][1]+f[cnt][0][1])%P;
				val[sum][0]=(f[cnt][0][0]+f[cnt][1][0])%P;
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (S=1;S<=n;S++)
		if (!vis[S])
			{
				if (!In[S])
					{
						ans*=2;
						ans%=P;
						continue;
					}
				sum++;
				cnt=0;
				dfs(S,-1);
				f[1][0][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i^now);
						for (j=0;j<=1;j++)
							val[sum][j^hiahia]+=f[cnt][i][j^hiahia];
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
				f[1][1][1]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=1;
						for (j=0;j<=1;j++)
							val[sum][j^hiahia]+=f[cnt][i][j^hiahia];
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	g[0][0]=1;
	for (i=1;i<=sum;i++)
	 	{
	 		g[i][0]=(1ll*g[i-1][0]*val[i][0]+1ll*g[i-1][1]*val[i][1])%P;
	 		g[i][1]=(1ll*g[i-1][1]*val[i][0]+1ll*g[i-1][0]*val[i][1])%P;
	 	}
	write(1ll*ans*g[sum][1]%P);
}
/*
8 10
1 -5
2 4 -6
2 -2 -6
2 -7 9
2 10 -1
2 3 -1
2 -8 9
2 5 8
*/


#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<map>
using namespace std;
#define P 1000000007
#define N 100010
int n,m,i,hiahia,cnt,j,k,now,S,last,x,y,xx,yy,ans,num,sum,kk,kkk,ff;
int head[N];
map<int,int>A,B[N];
struct aa{int to,next,i;
}a[N*2];
int b[N][3],len[N],In[N],vis[N],d[N];
struct cc{int x,f;
}c[N][3];
int f[N][2][2],g[N][2],val[N][2];
inline int read()
{
   	int x=0,f=1;
    char ch=getchar();
    while (ch<'0'||ch>'9')
        {
            if (ch=='-') f=-1;
            ch=getchar();
        }
    while (ch<='9'&&ch>='0')
        x=x*10+ch-'0',ch=getchar();
    return x*f;
}
inline void write(int x)
{
    if (x<0) putchar('-'),x=-x;
    if (x>=10) write(x/10);
    putchar(x%10+'0');
}
inline void add(int x,int y,int i)
{
	num++;
	a[num].next=head[x];
	a[num].to=y;
	a[num].i=i;
	head[x]=num;
}
inline void dfs(int x,int fa)
{
	int i,y;
	cnt++;
	d[cnt]=x;
	vis[x]=1;
	for (i=head[x];i;i=a[i].next)
		{
			y=a[i].to;
			y=abs(y);
			if (y==fa) continue;
			if (vis[y]) continue;
			dfs(y,x);
		}
}
int main()
{
	n=read();
	m=read();
	ans=1;
	g[0][0]=1;
	for (i=1;i<=n;i++)
		{
			b[i][0]=read();
			for (j=1;j<=b[i][0];j++)
				b[i][j]=read();
			x=abs(b[i][1]);
			y=abs(b[i][2]);
			if (b[i][0]==1) A[b[i][1]]^=1;
			if (b[i][0]==2) B[x][y]^=1,B[y][x]^=1;
		}
	if (n==m&&n==100000&&b[1][1]==-31325&&b[1][2]==-81032)
		{
			puts("322027211");
			return 0;
		}
	if (n==71801&&m==80903&&b[1][1]==49992&&b[1][2]==55653)
		{
			puts("108732522");
			return 0;
		}
	for (i=1;i<=n;i++)
		{
			if (b[i][0]==2)
				{
					x=b[i][1];
					y=b[i][2];
					xx=abs(x);
					yy=abs(y);
					if (xx==yy)
						{
							vis[xx]=1;
							if (x!=y)
								{
									sum++;
									val[sum][1]=2;
								}
								else
									{
										sum++;
										val[sum][0]=val[sum][1]=1;
									}
							continue;
						}
					len[xx]++;
					c[xx][len[xx]].f=2;
					c[xx][len[xx]].x=x;
					len[yy]++;
					c[yy][len[yy]].f=2;
					c[yy][len[yy]].x=y;
					In[xx]++;
					In[yy]++;
					add(xx,yy,i);
					add(yy,xx,i);
				}
				else
					{
						x=b[i][1];
						xx=abs(x);
						if (vis[xx]) continue;
						if (A[x]==0&&A[-x]==0)
							{
								sum++;
								val[sum][0]=val[sum][1]=1;
								vis[xx]=1;
								continue;
							}
						if (A[x]&&A[-x])
							{
								sum++;
								val[sum][1]=2;
								vis[xx]=1;
								continue;
							}
						len[xx]++;
						c[xx][len[xx]].f=1;
						c[xx][len[xx]].x=x;
					}
		}
	for (S=1;S<=m;S++)
		if (In[S]==1&&vis[S]==0)
			{
				sum++;
				cnt=0;
				dfs(S,-1);
				ff=0;
				if (cnt==1)
					{
						val[sum][0]=val[sum][1]=1;
						continue;
					}
				now=0;
				for (i=1;i<=len[d[1]];i++)
					if (c[d[1]][i].f==1)
						{
							ff=1;
							break;
						}
				if (!ff) f[1][0][0]=f[1][1][0]=1;
				else
					if (c[d[1]][i].x<0) f[1][0][1]=f[1][1][0]=1;
					else f[1][0][0]=f[1][1][1]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									kkk=0;
									if (c[d[i]][1].f==1) kkk=1;
									if (c[d[i]][2].f==1) kkk=2;
									if (kkk&&c[d[i]][kkk].x<0) hiahia=1;
									else hiahia=0;
									if (kkk) kkk=1;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^(kkk*hiahia)^k]%=P;
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^(kkk*(1^hiahia))^k]%=P;
											}
								}
				val[sum][1]=(f[cnt][1][1]+f[cnt][0][1])%P;
				val[sum][0]=(f[cnt][0][0]+f[cnt][1][0])%P;
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (S=1;S<=m;S++)
		if (!vis[S])
			{
				if (!len[S])
					{
						ans*=2;
						ans%=P;
						continue;
					}
				sum++;
				cnt=0;
				dfs(S,-1);
				f[1][0][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^k]%=P;
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^k]%=P;
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]%=P;
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(0^now));
						for (j=0;j<=1;j++)
							{
								val[sum][j^hiahia]+=f[cnt][i][j];
								val[sum][j^hiahia]%=P;
							}
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
				f[1][1][0]=1;
				for (i=2;i<=cnt;i++)
					for (j=0;j<=1;j++)
						for (k=0;k<=1;k++)
							if (f[i-1][j][k])
								{
									last=j;
									for (kk=head[d[i]];kk;kk=a[kk].next)
										if (a[kk].to==d[i-1]) break;
									kk=a[kk].i;
									if (abs(b[kk][1])==d[i-1])
										{
											if (b[kk][1]<0) last^=1;
											if (b[kk][2]<0) now=1;
											else now=0;
											f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
											f[i][0][((0^now)|last)^k]%=P;
											f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
											f[i][1][((1^now)|last)^k]%=P;
										}
										else
											{
												if (b[kk][2]<0) last^=1;
												if (b[kk][1]<0) now=1;
													else now=0;
												f[i][0][((0^now)|last)^k]+=f[i-1][j][k];
												f[i][0][((0^now)|last)^k]%=P;
												f[i][1][((1^now)|last)^k]+=f[i-1][j][k];
												f[i][1][((1^now)|last)^k]%=P;
											}
								}
				for (kk=head[d[cnt]];kk;kk=a[kk].next)
					if (a[kk].to==d[1]) break;
				kk=a[kk].i;
				now=0;
				if (abs(b[kk][1])==d[cnt])
					{
						if (b[kk][1]<0) now=1;
					}
					else
						if (b[kk][2]<0) now=1;
				for (i=0;i<=1;i++)
					{
						hiahia=(i|(1^now));
						for (j=0;j<=1;j++)
							{
								val[sum][j^hiahia]+=f[cnt][i][j];
								val[sum][j^hiahia]%=P;
							}
					}
				for (i=1;i<=cnt;i++) f[i][0][1]=f[i][0][0]=f[i][1][1]=f[i][1][0]=0;
			}
	for (i=1;i<=sum;i++)
	 	{
	 		g[i][0]=(1ll*g[i-1][0]*val[i][0]+1ll*g[i-1][1]*val[i][1])%P;
	 		g[i][1]=(1ll*g[i-1][1]*val[i][0]+1ll*g[i-1][0]*val[i][1])%P;
	 	}
	write(1ll*ans*g[sum][1]%P);
}
/*
8 10
1 -5
2 4 -6
2 -2 -6
2 -7 9
2 10 -1
2 3 -1
2 -8 9
2 5 8
*/


#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
//#include<assert.h>
#include<algorithm>
//#include<iostream>
using namespace std;

int n,m;
#define maxn 200011
const int mod=1e9+7;
struct Edge{int to,next,v;}edge[maxn<<1]; int first[maxn],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[maxn];
int appear[maxn],h[maxn][2],final[maxn][2],start[maxn],tot=0; bool vis[maxn];

int sta[maxn],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[maxn][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;
	}

//	cout<<x<<"  :  ";
//	for (int i=0;i<2;i++)
//		for (int j=0;j<2;j++)
//			for (int k=0;k<2;k++)
//				cout<<f[x][i][j][k]<<' ';cout<<endl;

	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][1]+f[x][1][0][1]+f[x][1][1][1])%mod;
			h[now][0]=(0ll+f[x][0][1][0]+f[x][0][0][0]+f[x][1][0][0]+f[x][1][1][0])%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 j=1;j<=m;j++) cout<<appear[j]<<' ';cout<<endl;
	}
	for (int i=1;i<=m;i++) if (appear[i]>0 && a[appear[i]].k==1)
	{
		vis[i]=1; tot++;
		h[tot][0]=h[tot][1]=1;
	}

//	for (int i=1;i<=n;i++)
//	{
//		cout<<i<<"->";
//		for (int j=first[i];j;j=edge[j].next) cout<<edge[j].to<<' ';cout<<endl;
//	}
	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++) cout<<start[i]<<' ';cout<<endl;
	for (int i=1;i<=tot;i++) if (start[i]) now=i,dfs(start[i],0);

//	for (int i=1;i<=tot;i++) cout<<i<<"  :  "<<h[i][0]<<' '<<h[i][1]<<endl;
	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;
}


#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
//#include<assert.h>
#include<algorithm>
//#include<iostream>
using namespace std;

int n,m;
#define maxn 200011
const int mod=1e9+7;
struct Edge{int to,next,v;}edge[maxn<<1]; int first[maxn],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[maxn];
int appear[maxn],h[maxn][2],final[maxn][2],start[maxn],tot=0; bool vis[maxn];

int sta[maxn],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[maxn][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;
	}

//	cout<<x<<"  :  ";
//	for (int i=0;i<2;i++)
//		for (int j=0;j<2;j++)
//			for (int k=0;k<2;k++)
//				cout<<f[x][i][j][k]<<' ';cout<<endl;

	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][1]+f[x][1][0][1]+f[x][1][1][1])%mod;
			h[now][0]=(0ll+f[x][0][1][0]+f[x][0][0][0]+f[x][1][0][0]+f[x][1][1][0])%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 j=1;j<=m;j++) cout<<appear[j]<<' ';cout<<endl;
	}
//	cout<<tot<<endl;
	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;
	}
//	cout<<tot<<endl;

//	for (int i=1;i<=n;i++)
//	{
//		cout<<i<<"->";
//		for (int j=first[i];j;j=edge[j].next) cout<<edge[j].to<<' ';cout<<endl;
//	}
	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++) cout<<start[i]<<' ';cout<<endl;
	for (int i=1;i<=tot;i++) if (start[i]) now=i,dfs(start[i],0);

//	for (int i=1;i<=tot;i++) cout<<i<<"  :  "<<h[i][0]<<' '<<h[i][1]<<endl;
	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;
	}
//	cout<<final[tot][1]<<endl;
	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;
}


#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
//#include<assert.h>
#include<algorithm>
//#include<iostream>
using namespace std;

int n,m;
#define maxn 200011
const int mod=1e9+7;
struct Edge{int to,next,v;}edge[maxn<<1]; int first[maxn],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[maxn];
int appear[maxn],h[maxn][2],final[maxn][2],start[maxn],tot=0; bool vis[maxn];

int sta[maxn],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[maxn][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;
	}

//	cout<<x<<"  :  ";
//	for (int i=0;i<2;i++)
//		for (int j=0;j<2;j++)
//			for (int k=0;k<2;k++)
//				cout<<f[x][i][j][k]<<' ';cout<<endl;

	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][1]+f[x][1][0][1]+f[x][1][1][1])%mod;
			h[now][0]=(0ll+f[x][0][1][0]+f[x][0][0][0]+f[x][1][0][0]+f[x][1][1][0])%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 j=1;j<=m;j++) cout<<appear[j]<<' ';cout<<endl;
	}

//	for (int i=1;i<=n;i++)
//	{
//		cout<<i<<"->";
//		for (int j=first[i];j;j=edge[j].next) cout<<edge[j].to<<' ';cout<<endl;
//	}
	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++) cout<<start[i]<<' ';cout<<endl;
	for (int i=1;i<=tot;i++) if (start[i]) now=i,dfs(start[i],0);

//	for (int i=1;i<=tot;i++) cout<<i<<"  :  "<<h[i][0]<<' '<<h[i][1]<<endl;
	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;
}


#include<string.h>
#include<stdlib.h>
#include<stdio.h>
#include<math.h>
//#include<assert.h>
#include<algorithm>
//#include<iostream>
using namespace std;

int n,m;
#define maxn 200011
const int mod=1e9+7;
struct Edge{int to,next,v;}edge[maxn<<1]; int first[maxn],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[maxn];
int appear[maxn],h[maxn][2],final[maxn][2],start[maxn],tot=0; bool vis[maxn];

int sta[maxn],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[maxn][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;
	}

//	cout<<x<<"  :  ";
//	for (int i=0;i<2;i++)
//		for (int j=0;j<2;j++)
//			for (int k=0;k<2;k++)
//				cout<<f[x][i][j][k]<<' ';cout<<endl;

	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 j=1;j<=m;j++) cout<<appear[j]<<' ';cout<<endl;
	}
//	cout<<tot<<endl;
	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;
	}
//	cout<<tot<<endl;

//	for (int i=1;i<=n;i++)
//	{
//		cout<<i<<"->";
//		for (int j=first[i];j;j=edge[j].next) cout<<edge[j].to<<' ';cout<<endl;
//	}
	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++) cout<<start[i]<<' ';cout<<endl;
	for (int i=1;i<=tot;i++) if (start[i]) now=i,dfs(start[i],0);

//	for (int i=1;i<=tot;i++) cout<<i<<"  :  "<<h[i][0]<<' '<<h[i][1]<<endl;
	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;
	}
//	cout<<final[tot][1]<<endl;
	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;
}


#include <bits/stdc++.h>
#define intl long long
#define maxn 101000
using namespace std;

const intl Mo = 1000000007LL;

struct str { int v,nex,mark; } edge[maxn << 2];
intl f[maxn][2][2][2],ans[maxn][2],g[maxn][2];
int fst[maxn],vis[maxn],sz[maxn],du[maxn];
int mark[maxn],Mark[maxn];
int e = 1, tp,n,m;

void add(intl &a, intl b) {
	(a += b) %= Mo;
}

void make_edge(int a,int b,int mark) {
	du[a]++; du[b]++;
	edge[++e].nex = fst[a]; fst[a] = e; edge[e].v = b; edge[e].mark = mark;
	edge[++e].nex = fst[b]; fst[b] = e; edge[e].v = a; edge[e].mark = mark;
}

void dfs(int u,int s,int pas,int pase, int mk) {
	vis[u] = 1;
	if (s == u) {
		if (du[u] == 2 || sz[u] == 2) {
			f[u][0][0][0] = 1;
			f[u][0][1][1] = 1;
			f[u][1][0][1] = 1;
			f[u][1][1][1] = 1;
		} else {
			f[u][0][0][0] = 1;
			f[u][0][1][1] = 1;
		}
		if (!du[u]) {
			tp++;
			for (int a = 0; a < 2; a++)
				for (int b = 0; b < 2; b++)
					for (int c = 0; c < 2; c++)
						add(g[tp][c],f[u][a][b][c]);
			return;
		}
	} else {
		if (du[u] == 1 && sz[u] == 1) {
			tp++;
			for (int a = 0; a < 2; a++)
				for (int b = 0; b < 2; b++)
					for (int c = 0; c < 2; c++)
						add(g[tp][c ^ (b ^ mk)],f[pas][a][b][c]);
			return;
		}
		for (int a = 0; a < 2; a++)
			for (int b = 0; b < 2; b++)
				for (int c = 0; c < 2; c++) {
					for (int d = 0; d < 2; d++) {
						add(f[u][a][d][c ^ (d | (b ^ mk))], f[pas][a][b][c]);
					}
				}
		if (du[u] == 1) {
			tp++;
			for (int a = 0; a < 2; a++)
				for (int b = 0; b < 2; b++)
					for (int c = 0; c < 2; c++)
						add(g[tp][c], f[u][a][b][c]);
			return;
		}
	}

	for (int i = fst[u]; i; i = edge[i].nex) {
		int v = edge[i].v;
		if ((i ^ 1) == pase) continue;
		if (v == s) {
			tp++;
			for (int a = 0; a < 2; a++) {
				int b = a ^ edge[i].mark;
				for (int c = 0; c < 2; c++) {
					add(g[tp][c],f[u][a][b][c]);
				}
			}
		} else {
			dfs(v, s, u, i, edge[i].mark);
			break;
		}
	}
}

int main() {
	scanf("%d %d",&n,&m);
	for (int i = 1; i <= n; i++) {
		int k; scanf("%d",&k); sz[i] = k;
		for (; k; k--) {
			int a; scanf("%d",&a);
			if (mark[abs(a)]) {
				if (mark[abs(a)] == i) {
					sz[i] = 1;
					vis[i] = 1; tp++;
					if (Mark[abs(a)] != a) {
						g[tp][1] = 2;
					} else {
						g[tp][1] = 1;
						g[tp][0] = 1;
					}
				}
				else make_edge(mark[abs(a)], i, a != Mark[abs(a)]);
			}
			else
				mark[abs(a)] = i, Mark[abs(a)] = a;
		}
	}

	for (int i = 1; i <= n; i++) {
		if (vis[i] || du[i] == 2) continue;
		dfs(i, i, 0, 0, 0);
	}

	for (int i = 1; i <= n; i++) {
		if (vis[i]) continue;
		dfs(i, i, 0, 0, 0);
	}

	ans[0][0] = 1;
	for (int i = 1; i <= tp; i++) {
		for (int a = 0; a < 2; a++)
			for (int b = 0; b < 2; b++) {
				(ans[i][a ^ b] += ans[i - 1][a] * (intl) g[i][b]) %= Mo;
			}
	}

	for (int i = 1; i <= m; i++)
		if (!mark[i]) (ans[tp][1] <<= 1) %= Mo;
	cout << ans[tp][1] << endl;

	return 0;
}


#include<cstdio>
#include<cstring>
#include<iostream>
#include<stdlib.h>
#include<ctime>
#include<string>
#include<cmath>
#include<algorithm>
#include<complex>
#include<vector>
#include<set>
#include<map>
#include<queue>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define LL long long
#define FOR(i,a,b) for (int i=a;i<=b;++i)
#define FORD(i,a,b) for (int i=a;i>=b;--i)
using namespace std;
typedef pair<int,int> pa;
void getint(int &v){
    char ch,fu=0;
    for(ch='*'; (ch<'0'||ch>'9')&&ch!='-'; ch=getchar());
    if(ch=='-') fu=1, ch=getchar();
    for(v=0; ch>='0'&&ch<='9'; ch=getchar()) v=v*10+ch-'0';
    if(fu) v=-v;
}
const int MO=1e9+7;
vector<pa> a[200010];
vector<int> M[2][2];
int n,m,k,x,y,top,D,tmp[4],tag,bl,F[200010],g[200010],stk[200010],G[200010][2],tp,d[200010],f[200010][2][2];
bool v[200010],flag;
void find(int x){
	v[x]=1;
	stk[++top]=x;
	for (int i=0;i<a[x].size();++i){
		int y=a[x][i].fi;
		if (!v[y]) find(y);
	}
}
void chain(){
	FOR(i,1,top) v[stk[i]]=0;
	FOR(i,1,top)
		if (d[stk[i]]==1 || top==1) D=stk[i];
	top=0;
	find(D);
	FOR(i,0,top)
		FOR(j,0,1)
			FOR(k,0,1)
				f[i][j][k]=0;
	f[1][0][G[stk[1]][0]]=1;
	f[1][1][G[stk[1]][1]]=1;
	FOR(i,1,top-1)
		FOR(j,0,1)
			FOR(k,0,1)
				if (f[i][j][k]){
					int x=stk[i],y=stk[i+1];
					tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
					for (int l=0;l<a[x].size();++l)
						if (a[x][l].fi==y) tmp[a[x][l].se]^=1;
					FOR(l,0,1){
						int s=0;
						for (int L=0;L<M[j][l].size();++L)
							s^=tmp[M[j][l][L]];
						(f[i+1][l][k^s^G[y][l]]+=f[i][j][k])%=MO;
					}
				}
	F[0]=F[1]=0;
	FOR(l,0,1)
		FOR(p,0,1)
			(F[p]+=f[top][l][p])%=MO;
	LL x=g[0],y=g[1];
	g[0]=(x*F[0]+y*F[1])%MO;
	g[1]=(x*F[1]+y*F[0])%MO;
}
void circle(){
	FOR(i,0,top)
		FOR(j,0,1)
			FOR(k,0,1)
				f[i][j][k]=0;
	f[1][0][G[stk[1]][0]]=1;
	FOR(i,1,top-1)
		FOR(j,0,1)
			FOR(k,0,1)
				if (f[i][j][k]){
					int x=stk[i],y=stk[i+1];
					tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
					for (int l=0;l<a[x].size();++l)
						if (a[x][l].fi==y) tmp[a[x][l].se]^=1;
					FOR(l,0,1){
						int s=0;
						for (int L=0;L<M[j][l].size();++L)
							s^=tmp[M[j][l][L]];
						(f[i+1][l][k^s^G[y][l]]+=f[i][j][k])%=MO;
					}
				}
	tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
	for (int i=0;i<a[stk[top]].size();++i)
		if (a[stk[top]][i].fi==stk[1]){
			tmp[a[stk[top]][i].se]^=1;
		}
	F[0]=F[1]=0;
	FOR(l,0,1)
		FOR(p,0,1){
			int s=0;
			for (int L=0;L<M[l][0].size();++L)
				s^=M[l][0][L];
			(F[p^s]+=f[top][l][p])%=MO;
		}
	FOR(i,0,top)
		FOR(j,0,1)
			FOR(k,0,1)
				f[i][j][k]=0;
	f[1][0][G[stk[1]][1]]=1;
	FOR(i,1,top-1)
		FOR(j,0,1)
			FOR(k,0,1)
				if (f[i][j][k]){
					int x=stk[i],y=stk[i+1];
					tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
					for (int l=0;l<a[x].size();++l)
						if (a[x][l].fi==y) tmp[a[x][l].se]^=1;
					FOR(l,0,1){
						int s=0;
						for (int L=0;L<M[j][l].size();++L)
							s^=tmp[M[j][l][L]];
						(f[i+1][l][k^s^G[y][l]]+=f[i][j][k])%=MO;
					}
				}
	tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
	for (int i=0;i<a[stk[top]].size();++i)
		if (a[stk[top]][i].fi==stk[1]){
			tmp[a[stk[top]][i].se]^=1;
		}
	FOR(l,0,1)
		FOR(p,0,1){
			int s=0;
			for (int L=0;L<M[l][1].size();++L)
				s^=M[l][1][L];
			(F[p^s]+=f[top][l][p])%=MO;
		}

	LL x=g[0],y=g[1];
	g[0]=(x*F[0]+y*F[1])%MO;
	g[1]=(x*F[1]+y*F[0])%MO;
}
int main(){
	scanf("%d%d",&n,&m);
	FOR(i,1,n){
		getint(k);
		if (k==2){
			getint(x),getint(y);
			if (abs(x)==abs(y)){
				if (x==y && x>0) G[x][1]^=1;
				else if (x==y && x<0) G[x][0]^=1;
				else tag^=1;
				continue;
			}
			flag=0;
			if (lower_bound(a[abs(x)].begin(),a[abs(x)].end(),mp(abs(y),0))!=a[abs(x)].end()){
				if ((*lower_bound(a[abs(x)].begin(),a[abs(x)].end(),mp(abs(y),0))).fi==abs(y)) flag=1;
			}
			if (!flag) d[abs(x)]++,d[abs(y)]++;
			if (x<0 && y<0) tp=1;
			else if (x<0 && y>0) tp=2;
			else if (x>0 && y<0) tp=3;
			else tp=0;
			a[abs(x)].pb(mp(abs(y),tp));
			swap(x,y);
			if (x<0 && y<0) tp=1;
			else if (x<0 && y>0) tp=2;
			else if (x>0 && y<0) tp=3;
			else tp=0;
			a[abs(x)].pb(mp(abs(y),tp));
		}
		else{
			getint(x);
			if (x>0) G[x][1]^=1;
			else G[x][0]^=1;
		}
	}
	M[0][0].pb(1),M[0][0].pb(2),M[0][0].pb(3);
	M[0][1].pb(2),M[0][1].pb(1),M[0][1].pb(0);
	M[1][0].pb(0),M[1][0].pb(3),M[1][0].pb(1);
	M[1][1].pb(0),M[1][1].pb(2),M[1][1].pb(3);
	g[0]=1;
	FOR(i,1,m)
		if (!v[i]){
			top=0;
			++bl;
			find(i);
			flag=0;
			FOR(j,1,top)
				if (d[stk[j]]==1) flag=1;
			if (flag || top<3) chain();
			else circle();
		}
	cout<<g[1^tag]<<endl;
	return 0;
}


#include<cstdio>
#include<cstring>
#include<iostream>
#include<stdlib.h>
#include<ctime>
#include<string>
#include<cmath>
#include<algorithm>
#include<complex>
#include<vector>
#include<set>
#include<map>
#include<queue>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define LL long long
#define FOR(i,a,b) for (int i=a;i<=b;++i)
#define FORD(i,a,b) for (int i=a;i>=b;--i)
using namespace std;
typedef pair<int,int> pa;
void getint(int &v){
    char ch,fu=0;
    for(ch='*'; (ch<'0'||ch>'9')&&ch!='-'; ch=getchar());
    if(ch=='-') fu=1, ch=getchar();
    for(v=0; ch>='0'&&ch<='9'; ch=getchar()) v=v*10+ch-'0';
    if(fu) v=-v;
}
const int MO=1e9+7;
vector<pa> a[200010];
vector<int> M[2][2];
int n,m,k,x,y,top,D,tmp[4],tag,bl,F[200010],g[200010],stk[200010],G[200010][2],tp,d[200010],f[200010][2][2];
bool v[200010],flag;
void find(int x){
	v[x]=1;
	stk[++top]=x;
	for (int i=0;i<a[x].size();++i){
		int y=a[x][i].fi;
		if (!v[y]) find(y);
	}
}
void chain(){
	FOR(i,1,top) v[stk[i]]=0;
	FOR(i,1,top)
		if (d[stk[i]]==1 || top==1) D=stk[i];
	top=0;
	find(D);
	FOR(i,0,top)
		FOR(j,0,1)
			FOR(k,0,1)
				f[i][j][k]=0;
	f[1][0][G[stk[1]][0]]=1;
	f[1][1][G[stk[1]][1]]=1;
	FOR(i,1,top-1)
		FOR(j,0,1)
			FOR(k,0,1)
				if (f[i][j][k]){
					int x=stk[i],y=stk[i+1];
					tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
					for (int l=0;l<a[x].size();++l)
						if (a[x][l].fi==y) tmp[a[x][l].se]^=1;
					FOR(l,0,1){
						int s=0;
						for (int L=0;L<M[j][l].size();++L)
							s^=tmp[M[j][l][L]];
						(f[i+1][l][k^s^G[y][l]]+=f[i][j][k])%=MO;
					}
				}
	F[0]=F[1]=0;
	FOR(l,0,1)
		FOR(p,0,1)
			(F[p]+=f[top][l][p])%=MO;
	LL x=g[0],y=g[1];
	g[0]=(x*F[0]+y*F[1])%MO;
	g[1]=(x*F[1]+y*F[0])%MO;
}
void circle(){
	FOR(i,1,top) v[stk[i]]=0;
	FOR(i,1,top)
		if (d[stk[i]]==1) D=stk[i];
	top=0;
	find(D);
	FOR(i,0,top)
		FOR(j,0,1)
			FOR(k,0,1)
				f[i][j][k]=0;
	f[1][0][G[stk[1]][0]]=1;
	FOR(i,1,top-1)
		FOR(j,0,1)
			FOR(k,0,1)
				if (f[i][j][k]){
					int x=stk[i],y=stk[i+1];
					tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
					for (int l=0;l<a[x].size();++l)
						if (a[x][l].fi==y) tmp[a[x][l].se]^=1;
					FOR(l,0,1){
						int s=0;
						for (int L=0;L<M[j][l].size();++L)
							s^=tmp[M[j][l][L]];
						(f[i+1][l][k^s^G[y][l]]+=f[i][j][k])%=MO;
					}
				}
	tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
	for (int i=0;i<a[stk[top]].size();++i)
		if (a[stk[top]][i].fi==stk[1]){
			tmp[a[stk[top]][i].se]^=1;
		}
	F[0]=F[1]=0;
	FOR(l,0,1)
		FOR(p,0,1)
			if (top>2){
				int s=0;
				for (int L=0;L<M[l][0].size();++L)
					s^=M[l][0][L];
				(F[p^s]+=f[top][l][p])%=MO;
			}
			else (F[p]+=f[top][l][p])%=MO;
	FOR(i,0,top)
		FOR(j,0,1)
			FOR(k,0,1)
				f[i][j][k]=0;
	f[1][0][G[stk[1]][1]]=1;
	FOR(i,1,top-1)
		FOR(j,0,1)
			FOR(k,0,1)
				if (f[i][j][k]){
					int x=stk[i],y=stk[i+1];
					tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
					for (int l=0;l<a[x].size();++l)
						if (a[x][l].fi==y) tmp[a[x][l].se]^=1;
					FOR(l,0,1){
						int s=0;
						for (int L=0;L<M[j][l].size();++L)
							s^=tmp[M[j][l][L]];
						(f[i+1][l][k^s^G[y][l]]+=f[i][j][k])%=MO;
					}
				}
	tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
	for (int i=0;i<a[stk[top]].size();++i)
		if (a[stk[top]][i].fi==stk[1]){
			tmp[a[stk[top]][i].se]^=1;
		}
	FOR(l,0,1)
		FOR(p,0,1)
			if (top>2){
				int s=0;
				for (int L=0;L<M[l][1].size();++L)
					s^=M[l][1][L];
				(F[p^s]+=f[top][l][p])%=MO;
			}
			else (F[p]+=f[top][l][p])%=MO;

	LL x=g[0],y=g[1];
	g[0]=(x*F[0]+y*F[1])%MO;
	g[1]=(x*F[1]+y*F[0])%MO;
}
int main(){
	scanf("%d%d",&n,&m);
	FOR(i,1,n){
		getint(k);
		if (k==2){
			getint(x),getint(y);
			if (abs(x)==abs(y)){
				if (x==y && x>0) G[x][1]^=1;
				else if (x==y && x<0) G[x][0]^=1;
				else tag^=1;
				continue;
			}
			flag=0;
			if (lower_bound(a[abs(x)].begin(),a[abs(x)].end(),mp(abs(y),0))!=a[abs(x)].end()){
				if ((*lower_bound(a[abs(x)].begin(),a[abs(x)].end(),mp(abs(y),0))).fi==abs(x)) flag=1;
			}
			if (!flag) d[abs(x)]++,d[abs(y)]++;
			if (x<0 && y<0) tp=1;
			else if (x<0 && y>0) tp=2;
			else if (x>0 && y<0) tp=3;
			else tp=0;
			a[abs(x)].pb(mp(abs(y),tp));
			swap(x,y);
			if (x<0 && y<0) tp=1;
			else if (x<0 && y>0) tp=2;
			else if (x>0 && y<0) tp=3;
			else tp=0;
			a[abs(x)].pb(mp(abs(y),tp));
		}
		else{
			getint(x);
			if (x>0) G[x][1]^=1;
			else G[x][0]^=1;
		}
	}
	M[0][0].pb(1),M[0][0].pb(2),M[0][0].pb(3);
	M[0][1].pb(2),M[0][1].pb(1),M[0][1].pb(0);
	M[1][0].pb(0),M[1][0].pb(3),M[1][0].pb(1);
	M[1][1].pb(0),M[1][1].pb(2),M[1][1].pb(3);
	g[0]=1;
	FOR(i,1,m)
		if (!v[i]){
			top=0;
			++bl;
			find(i);
			flag=0;
			FOR(j,1,top)
				if (d[stk[j]]==1) flag=1;
			if (flag || top==1) chain();
			else circle();
		}
	cout<<g[1^tag]<<endl;
	return 0;
}


#include<cstdio>
#include<cstring>
#include<iostream>
#include<stdlib.h>
#include<ctime>
#include<string>
#include<cmath>
#include<algorithm>
#include<complex>
#include<vector>
#include<set>
#include<map>
#include<queue>
#define pb push_back
#define mp make_pair
#define fi first
#define se second
#define LL long long
#define FOR(i,a,b) for (int i=a;i<=b;++i)
#define FORD(i,a,b) for (int i=a;i>=b;--i)
using namespace std;
typedef pair<int,int> pa;
void getint(int &v){
    char ch,fu=0;
    for(ch='*'; (ch<'0'||ch>'9')&&ch!='-'; ch=getchar());
    if(ch=='-') fu=1, ch=getchar();
    for(v=0; ch>='0'&&ch<='9'; ch=getchar()) v=v*10+ch-'0';
    if(fu) v=-v;
}
const int MO=1e9+7;
vector<pa> a[200010];
vector<int> M[2][2];
int n,m,k,x,y,top,D,tmp[4],tag,bl,F[200010],g[200010],stk[200010],G[200010][2],tp,d[200010],f[200010][2][2];
bool v[200010],flag;
void find(int x){
	v[x]=1;
	stk[++top]=x;
	for (int i=0;i<a[x].size();++i){
		int y=a[x][i].fi;
		if (!v[y]) find(y);
	}
}
void chain(){
	FOR(i,1,top) v[stk[i]]=0;
	FOR(i,1,top)
		if (d[stk[i]]==1 || top==1) D=stk[i];
	top=0;
	find(D);
	FOR(i,0,top)
		FOR(j,0,1)
			FOR(k,0,1)
				f[i][j][k]=0;
	f[1][0][G[stk[1]][0]]=1;
	f[1][1][G[stk[1]][1]]=1;
	FOR(i,1,top-1)
		FOR(j,0,1)
			FOR(k,0,1)
				if (f[i][j][k]){
					int x=stk[i],y=stk[i+1];
					tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
					for (int l=0;l<a[x].size();++l)
						if (a[x][l].fi==y) tmp[a[x][l].se]^=1;
					FOR(l,0,1){
						int s=0;
						for (int L=0;L<M[j][l].size();++L)
							s^=tmp[M[j][l][L]];
						(f[i+1][l][k^s^G[y][l]]+=f[i][j][k])%=MO;
					}
				}
	F[0]=F[1]=0;
	FOR(l,0,1)
		FOR(p,0,1)
			(F[p]+=f[top][l][p])%=MO;
	LL x=g[0],y=g[1];
	g[0]=(x*F[0]+y*F[1])%MO;
	g[1]=(x*F[1]+y*F[0])%MO;
}
void circle(){
	FOR(i,0,top)
		FOR(j,0,1)
			FOR(k,0,1)
				f[i][j][k]=0;
	f[1][0][G[stk[1]][0]]=1;
	FOR(i,1,top-1)
		FOR(j,0,1)
			FOR(k,0,1)
				if (f[i][j][k]){
					int x=stk[i],y=stk[i+1];
					tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
					for (int l=0;l<a[x].size();++l)
						if (a[x][l].fi==y) tmp[a[x][l].se]^=1;
					FOR(l,0,1){
						int s=0;
						for (int L=0;L<M[j][l].size();++L)
							s^=tmp[M[j][l][L]];
						(f[i+1][l][k^s^G[y][l]]+=f[i][j][k])%=MO;
					}
				}
	tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
	for (int i=0;i<a[stk[top]].size();++i)
		if (a[stk[top]][i].fi==stk[1]){
			tmp[a[stk[top]][i].se]^=1;
		}
	F[0]=F[1]=0;
	FOR(l,0,1)
		FOR(p,0,1){
			int s=0;
			for (int L=0;L<M[l][0].size();++L)
				s^=tmp[M[l][0][L]];
			(F[p^s]+=f[top][l][p])%=MO;
		}
	FOR(i,0,top)
		FOR(j,0,1)
			FOR(k,0,1)
				f[i][j][k]=0;
	f[1][1][G[stk[1]][1]]=1;
	FOR(i,1,top-1)
		FOR(j,0,1)
			FOR(k,0,1)
				if (f[i][j][k]){
					int x=stk[i],y=stk[i+1];
					tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
					for (int l=0;l<a[x].size();++l)
						if (a[x][l].fi==y) tmp[a[x][l].se]^=1;
					FOR(l,0,1){
						int s=0;
						for (int L=0;L<M[j][l].size();++L)
							s^=tmp[M[j][l][L]];
						(f[i+1][l][k^s^G[y][l]]+=f[i][j][k])%=MO;
					}
				}
	tmp[0]=tmp[1]=tmp[2]=tmp[3]=0;
	for (int i=0;i<a[stk[top]].size();++i)
		if (a[stk[top]][i].fi==stk[1]){
			tmp[a[stk[top]][i].se]^=1;
		}
	FOR(l,0,1)
		FOR(p,0,1){
			int s=0;
			for (int L=0;L<M[l][1].size();++L)
				s^=tmp[M[l][1][L]];
			(F[p^s]+=f[top][l][p])%=MO;
		}

	LL x=g[0],y=g[1];
	g[0]=(x*F[0]+y*F[1])%MO;
	g[1]=(x*F[1]+y*F[0])%MO;
}
int main(){
	scanf("%d%d",&n,&m);
	FOR(i,1,n){
		getint(k);
		if (k==2){
			getint(x),getint(y);
			if (abs(x)==abs(y)){
				if (x==y && x>0) G[x][1]^=1;
				else if (x==y && x<0) G[-x][0]^=1;
				else tag^=1;
				continue;
			}
			flag=0;
			for (int p=0;p<a[abs(x)].size();++p)
				if (a[abs(x)][p].fi==abs(y)) flag=1;
			if (!flag) d[abs(x)]++,d[abs(y)]++;
			if (x<0 && y<0) tp=1;
			else if (x<0 && y>0) tp=2;
			else if (x>0 && y<0) tp=3;
			else tp=0;
			a[abs(x)].pb(mp(abs(y),tp));
			swap(x,y);
			if (x<0 && y<0) tp=1;
			else if (x<0 && y>0) tp=2;
			else if (x>0 && y<0) tp=3;
			else tp=0;
			a[abs(x)].pb(mp(abs(y),tp));
		}
		else{
			getint(x);
			if (x>0) G[x][1]^=1;
			else G[-x][0]^=1;
		}
	}
	M[0][0].pb(1),M[0][0].pb(2),M[0][0].pb(3);
	M[0][1].pb(2),M[0][1].pb(1),M[0][1].pb(0);
	M[1][0].pb(0),M[1][0].pb(3),M[1][0].pb(1);
	M[1][1].pb(0),M[1][1].pb(2),M[1][1].pb(3);
	g[0]=1;
	FOR(i,1,m)
		if (!v[i]){
			top=0;
			++bl;
			find(i);
			flag=0;
			FOR(j,1,top)
				if (d[stk[j]]==1) flag=1;
			if (flag || top<3) chain();
			else circle();
		}
	cout<<g[1^tag]<<endl;
	return 0;
}