#include<bits/stdc++.h>
using namespace std;
const int N=1e6+11;
int t,n,m,v,a[N],b[N];
int x[N],y[N];
long long ans;
long long mod=1e9+7;
int f[N],g[N];
int d[4][2]={{1,2},{1,1},{2,2},{2,1}};
void dfs(int k){
	if(k==n){
		bool jud=1;
		
		for(int i=1;i<=n;i++){
			y[i]=x[i];
		}
		for(int i=1;i<n;i++){
			if(y[i]==a[i]){
				if(y[i+1]!=0&&y[i+1]!=b[i]){
//					cout<<y[i+1]<<" "<<b[i]<<endl;
					jud=0;
					break;
				}
				y[i+1]=b[i];
			}
		}
		if(jud){
			ans++;
//			for(int i=1;i<k;i++){
//				cout<<a[i]<<" ";
//			}
//			cout<<endl;
//			for(int i=1;i<k;i++){
//				cout<<b[i]<<" ";
//			}
//			cout<<endl;
		}
		ans%=mod;
		return ;
	}
	for(int i=0;i<4;i++){
		a[k]=d[i][0];
		b[k]=d[i][1];
		dfs(k+1);
	}
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	cin>>t;
	while(t--){
		ans=0;
		cin>>n>>m>>v;
		memset(x,0,sizeof(x));
		int pos,num;
		bool tp=0;
		for(int i=1;i<=m;i++){
			cin>>pos>>num;
			if(x[pos]!=0&&x[pos]!=num)tp=1;
			x[pos]=num;
		}
		if(tp){
//			continue;
			cout<<0<<endl;
			continue;
		}
		if(v==1){
//			continue;
			if(m==0)cout<<1<<endl;
			else cout<<0<<endl;
			continue;
		}
		if(v==2){
//			continue;
			dfs(1);
			cout<<ans<<endl;
			continue;
		}
		if(m==1){
			ans=1;
			for(int i=1;i<=n-1;i++){
				if(x[i]){
					pos=i;
					break;
				}
				ans*=v;
				ans%=mod;
				ans*=v;
				ans%=mod;
			}
			long long sum=0,sum2=1;
			for(int i=pos;i<n;i++){
				sum2*=v;
				sum2%=mod;
				sum2*=(v-1);
				sum2%=mod;
				sum2%=mod; 
				for(int j=i+1;i<n;i++){
					sum2*=v;
					sum2%=mod;
					sum2*=v;
					sum2%=mod;
				}
				sum+=sum2;
				sum%=mod;
				sum2=v;
			}
			ans*=sum;
			ans%=mod;
			cout<<ans<<endl;
		}
	}
	return 0;
}
