#include<bits/stdc++.h>
using namespace std;
/*
首先排除cd自己出问题的状况为0

对于每一个关系都有一个赋值，但实际上变量为1e9,因此可能有速算方法，比如组合数学
样例的第一个，为第一个赋值，2不赋值，那么有v*v种，并且2是随意的，每种情况等可能？ 
对于一不赋值，2不赋值，都可以任意选v*v，并且后面随意，情况等可能？ 
对于两者都赋值，(v-1)*v+1
1没有2有，v^2 
但是

似乎可以动态规划
dp[i][0/1]表示上一个i-1~i的约束是有效还是无效的所有情况
dp[i][0]=dp[i-1][1]*(v-1)*v+dp[i-1][0]*(v-1)*v (i,i-1无约束) 
dp[i][1]=dp[i-1][1]*v+dp[i-1][0]*v 
(i-1约束，i不约) 
dp[i][0]=dp[i-1][1]*v+dp[i-1][0]*v;
dp[i][1]=

好像是矩阵乘法
 
*/
 
const long long mod=1e9+7,N=1e6+5;
struct P{
	int c,d;
}node[N];
long long T,n,m,v,dp[N][2];
bool cmp(P x,P y){
	if(x.c!=y.c) return x.c<y.c;
	else return x.d<y.d; 
}
bool vis[N];
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>T;
	while(T--){
		cin>>n>>m>>v;
		bool pd=0;
		for(int i=1;i<=m;i++) cin>>node[i].c>>node[i].d,vis[node[i].c]=1;
		sort(node+1,node+1+m,cmp);
		for(int i=2;i<=m;i++){
			if(node[i].c==node[i-1].c&&node[i].d!=node[i-1].d) pd=1;
		}
		if(pd){
			cout<<0<<"\n";
			continue;
		}
		for(int i=1;i<=n;i++){
			dp[i][0]=dp[i][1]=0;
		}
		if(!vis[1]) dp[1][1]=1;
		else dp[1][0]=1;
		for(int i=2;i<=n;i++){
			if(vis[i]) dp[i][0]=(dp[i-1][1]*v%mod*v%mod+dp[i-1][0]*((v-1)*v+1)%mod)%mod,dp[i][1]=0;
			else dp[i][0]=v*dp[i-1][0]%mod,dp[i][1]=(dp[i-1][0]*(v-1)%mod*v%mod+dp[i-1][1]*v%mod*v%mod)%mod;
		}
		cout<<(dp[n][1]+dp[n][0])%mod<<"\n";
	}
	return 0;
}
