#include<bits/stdc++.h>
#define N 110000
using namespace std;
long long t,n,m,mm,v,c[N],ans=1,u,z,line;
bool pd;
const long long mo=1e9+7;
struct AB{
	long long a,b,n;
}d[N],dd[N];
long long kuai(long long a,long long b){
	long long num=1,k=a;
	while(b){
		if(b%2){
			num*=k;
			num%=mo;
		}
		k*=k;
		k%=mo;
		b>>=1;
	}
	return num;
}
bool cmp(AB a,AB b){
	return a.a<b.a;
}
int main(){
//	freopen("assign3.in","r",stdin);
	scanf("%lld",&t);
	while(t--){
		ans=1;
		pd=0;
		for(int i=1;i<=mm;i++)dd[i].n=0;
		scanf("%lld%lld%lld",&n,&m,&v);
		for(int i=1;i<=m;i++){
			scanf("%lld%lld",&dd[i].a,&dd[i].b);
		}
		sort(dd+1,dd+1+m,cmp);
		line=0;
		for(int i=1;i<=m;i++){
			if(dd[line].a==dd[i].a&&dd[line].b!=dd[i].b){
				pd=1;
				printf("0\n");
				break;
			}
			if(dd[line].a==dd[i].a&&dd[line].b==dd[i].b){
				dd[i].n=1;
			}
			else line=i;
		}
		if(pd)continue;
		mm=m;
		m=0;
		for(int i=1;i<=mm;i++){
			if(dd[i].n)continue;
			d[++m].a=dd[i].a;		
		}
		m--;
		for(int i=1;i<=m;i++){
			c[i]=d[i+1].a-d[i].a;
		}
		ans=1;
		for(int i=1;i<=m;i++){
			ans*=(kuai(v,c[i]-1)+((((v-1)%mo)*kuai(v,2*c[i]-1))%mo))%mo;
			ans%=mo;
		}
//		printf("%d %d %d\n",n,d[1].a,d[m+1].a);
		ans*=kuai(v,2*d[1].a-2);
		ans%=mo;
		ans*=kuai(v,2*(n-d[m+1].a));
		ans%=mo;
		ans=abs(ans);
		printf("%lld\n",ans);
	}
	return 0;
}
