#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mo=1e9+7,N=1e6+10;
int n,m,v,a[N],dp[N],fl,as[N],bs[N],ans,ca[N];
bool check() {
	for(int i=1;i<=n;i++) ca[i]=a[i];
	for(int i=1;i<n;i++)
	    if(ca[i]==as[i]) {
	    	if(ca[i+1]==0) ca[i+1]=bs[i];
	    	if(ca[i+1]!=bs[i]) return false;
		}
	return true ;
} 
void dfs(int x) {
	if(x==n) {
		if(check()) ans++;
		return ;
	}
	for(int i=1;i<=v;i++) 
	    for(int j=1;j<=v;j++) {
	        as[x]=i,bs[x]=j;
	    	dfs(x+1);
		}
}
int dfs2(int x) {
	if(dp[x]!=-1) return dp[x];
	if(x==n) return 1;
	if(a[x]!=0&&a[x+1]!=0) return dp[x]=dfs2(x+1)*((v-1)*v%mo+1)%mo;
	return dp[x]=dfs2(x+1)*v%mo*v%mo;
}
int ksm(int a,int b) {
	int ans=1;
	while(b) {
		if(b&1) ans=ans*a%mo;
		a=a*a%mo;
	    b>>=1;
	}
	return ans;
}
void solve() {
	scanf("%lld%lld%lld",&n,&m,&v);
	memset(a,0,sizeof(a));
	memset(dp,-1,sizeof(dp));
	if(m==1) {
		int c,d;
		scanf("%lld%lld",&c,&d);
		printf("%lld\n",ksm(v*v%mo,n-1));
		return ;
	}
	int fl=0;
	for(int i=1;i<=m;i++) {
		int c,d;
		scanf("%lld%lld",&c,&d);
		if(a[c]!=0&&a[c]!=d) fl=-1;
		else if(a[c]!=0&&fl>=0) fl++;
		a[c]=d;
	}
	if(fl==-1) {
		printf("0\n");
		return ;
	}
	if(n<=12) {
		ans=0;
		dfs(1);
	    printf("%lld\n",ans);
	}
	else printf("%lld\n",dfs2(1));
//	for(int i=1;i<=n;i++) cout<<dp[i]<<" ";
}
signed main() {
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int t;
	cin>>t;
	while(t--) solve();
	return 0;
}

