#include<bits/stdc++.h>
using namespace std;
int T;
int n,m,v;
struct lmtF{
	int p,val;//第p个元素的值为val 
} lm[100005];
int f[1145][114514];
map<int,int> mp;
long long M=1000000000+7;
long long pow(long long n,long long m){
	long long res=1;
	for(int i=0;i<m;i++){
		res*=n;
		res%=M;
	}
	return res;
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	
	scanf("%d",&T);
	while(T--){
		bool fastFlag=false;
		bool flagA=false;
		scanf("%d%d%d",&n,&m,&v);
		for(int i=0;i<m;i++){
			scanf("%d%d",&lm[i].p,&lm[i].val);
			if(mp[lm[i].p]!=0 && mp[lm[i].p]!=lm[i].val) fastFlag=true;
			mp[lm[i].p]=lm[i].val;
		}
		if(m==n && mp.size()==n) flagA=true;
		if(fastFlag){
			printf("0\n");
			continue;
		}
		if(flagA){
			long long cnt=0;
			long long tt=pow(v,n);
			for(int i=0;i<n-1;i++){
				cnt+=v-1;
				cnt%=M; 
			}
			printf("%lld\n",(tt-cnt)%M);
			continue;
		}
		printf("1\n");
	}
}
//舞萌DX更新了，但我还在机房骗分。。。 
