#include<bits/stdc++.h>
#define re register int
#define il inline
using namespace std;
typedef long long ll;
const ll Mod=1000000007;
const int N=1e6+10;
int n,m,T,tot,ccnt[N];
ll v,f[N],ans,A[N],B[N],C[N];
struct Node{
	int c,d;
}a[N];
il bool cmp(Node A,Node B){
	return A.c<B.c;
}
il ll qkpw(ll x,int y){
	if(y<0)return 1ll;
	if(y==0)return 1ll;
	ll res=1ll;
	while(y){
		if(y&1){
			res=res*x%Mod;
		}
		x=x*x%Mod;
		y>>=1;
	}
	return res;
}
il void dfs(int p){
	if(p==n){
		for(re i=1;i<=n;i++)C[i]=-1;
		for(re i=1;i<=m;i++)C[a[i].c]=a[i].d;
		bool gg=0;
		for(re i=1;i<n;i++){
			if(C[i]==A[i]){
				if(C[i+1]!=-1&&C[i+1]!=B[i]){
					gg=1;
					break;
				}
				C[i+1]=B[i];
			}
		}
		if(!gg){
			ans++;
			if(ans>=Mod)ans-=Mod;
		}
		return;
	}
	for(re i=1;i<=v;i++){
		for(re j=1;j<=v;j++){
			A[p]=i;
			B[p]=j;
			dfs(p+1);
		}
	}
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%lld",&n,&m,&v);
		for(re i=1;i<=m;i++)
			scanf("%d%d",&a[i].c,&a[i].d);
		sort(a+1,a+m+1,cmp);
		tot=1;
		bool fl=0;
		for(re i=2;i<=m;i++){
			if(a[i].c==a[tot].c){
				if(a[i].d!=a[tot].d){
					fl=1;
					break;
				}
			}
			else{
				tot++;
				a[tot]=a[i];
			}
		}
		if(fl){
			printf("0\n");
			continue;
		}
		if(n<=12&&m<=12&&v<=2){
			ans=0;
			dfs(1);
			printf("%lld\n",ans);
			continue;
		}
		if(tot==n){
			printf("%lld\n",qkpw((v*(v-1)%Mod+1)%Mod,n-1));
			continue;
		}
		if(tot<=1){
			ans=qkpw(v*v%Mod,n-1);
			printf("%lld\n",ans);
		}
		else{
			ans=qkpw(v*v%Mod,a[1].c-1);
			for(re i=1;i<tot;i++){
				ll sm=0;
				ll res=1ll;
				int cnt=a[i+1].c-a[i].c-1;
				for(re j=0;j<a[i+1].c-a[i].c;j++){
					sm=sm+(qkpw(v*v%Mod,cnt)*res%Mod*((v-1)*v%Mod)%Mod);
					sm=sm%Mod;
					res=res*v%Mod;
					cnt--;
				}
				sm=(sm+qkpw(v,a[i+1].c-a[i].c-1))%Mod;
				ans=ans*sm%Mod;
			}
			ans=ans*qkpw(v*v%Mod,n-a[tot].c)%Mod;
			printf("%lld\n",ans);
		}
	}
	return 0;
} 
