#include<bits/stdc++.h>
using namespace std;
#define N 100005
#define int long long
int T,n,m,v,fl,cnt,mo=1e9+7,ans;
int dat[N],dp[N];
struct point{
	int c,d;
	bool operator < (const point &C) const{
		return c<C.c||(c==C.c&&d<C.d);
	}
}sum[N];
int qpow(int d,int z){
	int ret=1;
	while(z){
		if(z%2) ret=(ret*d)%mo;
		z/=2;
		d=(d*d)%mo;
	}
	return ret;
}
int gettot(int s,int t){
	return qpow(v,2*(t-s));
}
int getnot(int s,int t){
	return (qpow(v,t-s-1)*((v-1)%mo))%mo;
}
int getgood(int s,int t){
	return ((gettot(s,t)-getnot(s,t))%mo+mo)%mo;
}
void init(){
	fl=0;
	cnt=0;
	ans=0;
}
signed main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%lld",&T);
	while(T--){
		init();
		scanf("%lld%lld%lld",&n,&m,&v);
		for(int i=1;i<=m;i++) scanf("%lld%lld",&sum[i].c,&sum[i].d);
		sort(sum+1,sum+1+m);
		for(int i=1;i<=m;i++){
			if(sum[i].c==sum[i-1].c&&sum[i].d!=sum[i-1].d){
				fl=1;
				break;
			}
			if(sum[i].c!=sum[i-1].c) dat[++cnt]=sum[i].c;
		}
		if(fl){
			printf("0\n");
			continue;
		}
		dp[1]=qpow(v,2*(dat[1]-1));
		for(int i=2;i<=cnt;i++){
			dp[i]=(dp[i-1]*getgood(dat[i-1],dat[i]))%mo;
		}
		ans=(dp[cnt]*qpow(v,2*(n-dat[cnt])))%mo;
		printf("%lld\n",ans);
	}
	return 0;
}
