#include<bits/stdc++.h>
using namespace std;
#define max_n 120000
#define mod 1000000007ll
int tid;
long long m;
int n;
long long lim;//保证lim>=2 
struct A{long long x,w;}a[max_n+2];
long long ans=1;
inline long long qp(long long a,long long b){
	long long res=1;
	while(b){
		if(b&1)res=res*a%mod;
		a=a*a%mod; b>>=1;
	}
	return res;
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%d",&tid);
	for(int ca=1;ca<=tid;++ca){
		scanf("%lld%d%lld",&m,&n,&lim);
		for(int i=1;i<=n;++i)scanf("%lld%lld",&a[i].x,&a[i].w);
		sort(a+1,a+n+1,[](A a,A b){return a.x<b.x;});
		ans=1;
		for(int i=1;i<n;++i){
			if(a[i].x==a[i+1].x&&a[i].w!=a[i+1].w){ans=0; break;}
		}
		if(ans==0){printf("0\n"); continue;}
		if(a[1].x>1)ans=ans*qp(lim,(a[1].x-1)*2)%mod;
		if(a[n].x<m)ans=ans*qp(lim,(m-a[n].x)*2)%mod;
		for(int i=1;i<n;++i){
			if(a[i].x==a[i+1].x)continue;
			long long all=qp(lim,(a[i+1].x-a[i].x)*2);//总方案数
			long long cnt=qp(lim,a[i+1].x-a[i].x-1)*(lim-1)%mod;//不合法方案数
			ans=ans*(all-cnt+mod)%mod;
		}
		printf("%lld\n",(ans%mod+mod)%mod);
	}
	return 0;
}

