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

const int N=1e5+5,mod=1e9+7;

int kase,n,m,k,lst,ans;

struct giao{
	int id,x;
}a[N];

bool cmp(giao x,giao y){
	return x.id<y.id;
}

bool check(){
	for(int i=2;i<=m;i++)
		if(a[i].id==a[i-1].id&&a[i].x!=a[i-1].x)
			return true;
	return false;
}

int qpow(int x,int y){
	int res=1;
	for(;y;y>>=1,x=1ll*x*x%mod)
		if(y&1) res=1ll*res*x%mod;
	return res; 
}

int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%d",&kase);
	while(kase--){
		scanf("%d%d%d",&n,&m,&k);
		for(int i=1;i<=m;i++)
			scanf("%d%d",&a[i].id,&a[i].x);
		sort(a+1,a+1+m,cmp);
		if(check()){
			printf("0\n");
			continue;
		}
//		cout<<0;
		ans=qpow(k,2*(a[1].id-1));
		lst=1;
		for(int i=2,x,res;i<=m;i++){
			if(a[i].id!=a[lst].id){
				x=(qpow(k,2*(a[i].id-a[lst].id))-1ll*qpow(k,a[i].id-a[lst].id-1)*(k-1)%mod+mod)%mod;
				ans=1ll*ans*x%mod;
				lst=i;
			}
		}
//		cout<<ans<<' ';
		ans=1ll*ans*qpow(k,2*(n-a[lst].id))%mod;
		printf("%d\n",ans);
	}
	return 0;
}
/*
1
7 1 2
4 1
*/
