#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=100005,mod=1000000007;
int t,n,m,v,a[N],x[N],y[N],z[N];
inline int fp(int x,int y){
	x%=mod;
	int r=1;
	while(y){
		if(y&1)(r*=x)%=mod;
		(x*=x)%=mod;
		y>>=1;
	}
	return r;
}
inline int inv(int x){
	return fp(x,mod-2);
}
inline void solve(){
	cin>>n>>m>>v;
	for(int i=1;i<=m;i++)a[i]=0;
	bool f=0;
	for(int i=1;i<=m;i++){
		cin>>x[i]>>y[i];
		z[i]=x[i];
	}
	sort(z+1,z+m+1);
	for(int i=1;i<=m;i++){
		x[i]=lower_bound(z+1,z+m+1,x[i])-z;
	}
	for(int i=1;i<=m;i++){
		if(a[x[i]]&&a[x[i]]!=y[i])f=1;
		else a[x[i]]=y[i];
	}
	if(f){//约束矛盾则无解 
		cout<<"0\n";
		return;
	}
	int res=fp(v,n+n-2);
	int pre=-1;
	for(int i=1;i<=m;i++){
		if(a[i]){
			if(~pre){
				int g=res*inv(fp(v,z[i]-z[pre]+z[i]-z[pre]))%mod;
				//不符合该要求的方案数 
				(g*=fp(v,z[i]-z[pre]-1))%=mod;
				(g*=v-1)%=mod;
				(res+=mod-g)%=mod;
				/*
				如果两个一元限制为a和b则形如
				a -> c
				c -> d
				d -> e
				e -> f (f!=b)
				的二元限制不符合要求
				*/
			}
			pre=i;
		}
	}
	cout<<res<<'\n';
}
signed main(){
#ifndef XYZ
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
#endif
	ios::sync_with_stdio(0);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--)solve();
	return 0;
}

