#include <bits/stdc++.h>
using namespace std;
const int N=1e7+5;
const long long P=1e9+7;
long long T,n,m,k,cnt,ans;
long long dp[N];
bool used[N];
bool tmp=false,tup=false;

struct iaknoip{
	long long x=0,y=0;
}l[N];

bool sortcmp(iaknoip xx,iaknoip yy){
	return xx.x<yy.x;
}

long long ft_pow(long long x,int y,long long p){
	x%=p;
	long long powans=1,base=x;
	while(y){
		if(y&1){
			powans*=base;
			powans%=p;
		}
		base*=base;
		base%=p;
		y>>=1;
	}
	return powans;
}

int main(){
	ios::sync_with_stdio(false);
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	cin>>T;
	while(T--){
		cin>>n>>m>>k;
		for(int i=1;i<=n;i++)used[i]=false;
		for(int i=1;i<=m;i++){
			cin>>l[i].x>>l[i].y;
			used[i]=true;
		}
		sort(l+1,l+m+1,sortcmp);
		tmp=true;
		for(int i=2;i<=m;i++){
			if(l[i].x==l[i-1].x&&l[i].y!=l[i-1].y){
				tmp=false;break;
			}
		}
		if(tmp){
			if((n==m&&l[2].x==2)){
				ans=ft_pow(k*(k-1)+1,n-1,P);
		    	cout<<ans<<endl;
			}
		    else{
		    	dp[0]=1;tup=false;
		    	for(int i=1;i<n;i++){
		    		if(used[i]&&used[i+1]){
		    			dp[i]=((((dp[i-1]*k)%P)*(k-1))%P+dp[i-1])%P;
					}
					else if(used[i+1]&&tup){
						dp[i]=(((((dp[i-1]+P-dp[i-2])%P)*k)%P)*k)%P;
					}
					else{
						dp[i]=(((dp[i-1]*k)%P)*k)%P;
					}
					if(used[i])tup=true;
				}
				cout<<dp[n-1]<<endl;
			}
		}
		else{
			cout<<0<<endl;
		}
	}
	
	
	
	
	return 0;
}
