#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,mod=1e9+7;
int T,n,m,v,x[N];
struct Node{
	int c,d;
}a[N];
bool check(int p,int q){
	int now=x[1];
	for(int i=1;i<n;i++){
		if(now>0&&now%2==(p>>(n-1-i)&1)){
			if(x[i+1]>0&&x[i+1]%2!=(q>>(n-1-i)&1)) return 0;
			if(x[i+1]==0) now=(q>>(n-1-i)&1)+((q>>(n-1-i)&1)==0)*2;
		}
		else{
			now=x[i+1];
		}
	}
	return 1;
}
long long ksm(long long a,int b){
	long long ans=1;
	while(b>0){
		if(b&1) ans=ans*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return ans;
} 
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%lld",&T);
	while(T--){
		scanf("%d%d%d",&n,&m,&v);
		bool bl=1,bl1=1;
		for(int i=1,c,d;i<=m;i++){
			scanf("%d%d",&a[i].c,&a[i].d);
			if(v<=2&&x[a[i].c]>0&&x[a[i].c]!=a[i].d){
				printf("0\n");
				bl=0;
				break;
			}
			if(v<=2) x[a[i].c]=a[i].d;
			if(a[i].c!=i) bl1=0;
		}
		if(!bl){
			for(int i=1;i<=m;i++){
				if(a[i].c==0) break;
				x[a[i].c]=0;
			} 
			continue;
		}
		if(v<=2){
			int ans=0;
			for(int i=0;i<(1<<n-1);i++){
				for(int j=0;j<(1<<n-1);j++){
					if(check(i,j)) ans++;
				}
			}
			printf("%d\n",ans); 
			for(int i=1;i<=m;i++){
				x[a[i].c]=0;
			}
			continue;
		}
		printf("%lld\n",ksm(v,2*n-2));
	}
}
