#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e6+10;
const int mod=1e9+7;
int c,T;
inline int read(){
	int s=0,f=0;
	char cha;
	cha=getchar();
	while(!isdigit(cha)){
		f|=(cha=='-');
		cha=getchar();
	}
	while(isdigit(cha)){
		s=(s<<1)+(s<<3)+(cha^48);
		cha=getchar();
	}
	return f?-s:s;
}
int n,m,v;
bool flag1,flag2,flag3;
int tt;
int cnt;
int cnt1;
int ttt;
struct node{
	int c,d;
}a[maxn];
int ans;
bool flag;
int cnt2,cnt3;
int qpow(int x,int y){
	int res=1;
	while(y){
		if (y&1) res=res*x%mod;
		x=x*x%mod;
		y>>=1;
	}
	return res;
}
int aa[maxn],bb[maxn];
int num[maxn];
map<int,int> mp;
void dfs(int x){
	if (x==n){
		for (int i=1;i<=n;i++){
			num[i]=mp[i];
		}
		for (int i=1;i<n;i++){
			if (!num[i]||num[i]!=aa[i]) continue;
			else if (num[i+1]==bb[i]||!num[i+1]) continue;
			else return;
		}
		ans++;
		ans%=mod;
		return;
	}
	for (int i=1;i<=2;i++){
		for (int j=1;j<=2;j++){
			aa[x]=i,bb[x]=j;
			dfs(x+1);
		}
	}
} 
signed main(){
	freopen("assign.in","r",stdin); //
	freopen("assign.out","w",stdout);//
	T=read(); 
	while(T--){
		mp.clear();
		cnt=0;
		flag1=1;
		flag=1;
		n=read(),m=read(),v=read();
		cnt1=cnt2=0;
		for (int i=1;i<=m;i++){
			a[i].c=read(),a[i].d=read();
			if (a[i].c!=i) flag1=0;
		}
		if (n<=20&&v==2){
			for (int i=1;i<=m;i++){
				if (mp[a[i].c]&&mp[a[i].c]!=a[i].d) flag=0;
				if (!mp[a[i].c]) cnt++;
				mp[a[i].c]=a[i].d;
			}
			if (!flag){
				cout<<0<<endl;
			}
			else{
				ans=0;
			dfs(1);
			cout<<ans<<endl;
			}
		}
		else if (flag1&&m==n){
			tt=(1+(v*(v-1))%mod);
			ans=qpow(tt,n-1);
			cout<<ans<<endl;
		}
		else{
			for (int i=1;i<=m;i++){
				if (mp[a[i].c]&&mp[a[i].c]!=a[i].d) flag=0;
				if (!mp[a[i].c]) cnt++;
				mp[a[i].c]=a[i].d;
			}
			if (!flag){
				cout<<0<<endl;
			}
			else{
				tt=(1+(v*(v-1))%mod);
				ans=qpow(tt,n-1);
				cout<<ans*qpow(v,n-cnt)%mod<<endl;
			}
		}
		//cout<<flag1<<endl;
	}
}
//
/*
3
2 1 2
1 1
2 2 2
1 1
2 2
2 2 2
1 1 
1 2

*/
