#include<bits/stdc++.h>
using namespace std;

long long mod=1e9+7;

long long read(){
	long long x=0,f=1;
	char ch=getchar();
	while(ch<'0' || ch>'9'){
		if(ch=='-')
			f=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9'){
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

struct lim{
	long long c,d;
}l[100005];

bool cmp(lim a,lim b){
	return a.c<b.c;	
}

long long qpow(long long a,long long b){
	long long res=1;
	while(b){
		if(b&1){
			res*=a;
			res%=mod;
			b--;
		}
		a*=a;
		a%=mod;
		b>>=1;
	}
	return res%mod;
}

int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	long long T=read();
	while(T--){
		long long n=read(),m=read(),v=read();
		for(long long i=1;i<=m;i++)
			l[i].c=read(),l[i].d=read();
		sort(l+1,l+1+m,cmp);
		long long cnt=0;
		bool f=false;
		for(long long i=2;i<=m;i++){
			if(l[i].c==l[i-1].c && l[i].d!=l[i-1].d){
				f=true;
				break;
			}
			if(l[i].c==l[i-1].c+1)
				cnt++;
		}
		if(f){
			printf("0\n");
			continue;
		}
		printf("%lld\n",(qpow(v,2*(n-1-cnt))*qpow((v*(v-1)+1)%mod,cnt)%mod)%mod);
	}
	return 0;
}
