#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7,N=1e5+10;
int t;
long long n,m,v,ans;
struct nb{
	int x,y;
}a[N];
bool nm(nb x,nb y){
	return x.x<y.x;
}
long long ksumi(long long x,long long y){
	if(y==0) return 1;
	if(y==1) return x%mod;
	long long sum=1;
	while(y>1){
		if(y&1) sum=sum%mod*x%mod;
		x=x%mod*x%mod;
		y>>=1;
	}
	sum=sum%mod*x%mod;
	return sum;
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	cin>>t;
	while(t--){
		ans=1;
		memset(a,-1,sizeof a);
		scanf("%lld%lld%lld",&n,&m,&v);
		for(int i=1;i<=m;i++) scanf("%d%d",&a[i].x,&a[i].y);
		sort(a+1,a+m+1,nm);
		long long h=-1,r=-1;
		bool op=0;
		for(int i=1;i<=m;i++){
			if(a[i].x==h&&a[i].y!=r){
				printf("0\n");
				op=1;
				break;
			}
			h=a[i].x;r=a[i].y;
		}
		if(op) continue;
		v%=mod;
		ans=ksumi(v*v%mod,n-1);
		for(int i=1;i<m;i++){
			if(a[i].x==a[i+1].x-1) ans=(ans%mod-v%mod)+1;
			else if(a[i].y==a[i+1].y&&a[i].x!=a[i+1].x) ans=ans%mod-v%mod;
		}
		printf("%lld\n",ans%mod);
	}
	return 0;
}
