#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N=1e6+10,mod=1e9+7;
ll n,m,v;
struct h{
	ll c,sum;
}e[N];
struct g{
	ll l,r;
}k[N];
ll a[N],p[N]; 
ll ksm(ll x,ll y){
	ll ji=x,res=1;
	while(y){
		if(y&1) res=res*ji%mod;
		y>>=1,ji=ji*ji%mod;
	} 
	return res;
}
bool cmp(h a,h b){
	return a.c<b.c||(a.c==b.c&&a.sum<b.sum);
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--){
		scanf("%lld%lld%lld",&n,&m,&v);
		bool fl=1;
		ll s1=v*v%mod,s2=(v*v-v+1)%mod;
		for(int i=1;i<=m;i++){
			scanf("%lld%lld",&e[i].c,&e[i].sum);
		}
		sort(e+1,e+m+1,cmp);
		ll tot=0,pl=0,pr=0,po=0;
		p[0]=-1;
		for(int i=1;i<=m;i++){
			if(e[i].c==e[i-1].c&&e[i].sum!=e[i-1].sum){
				fl=0;
				break;
			}
			if(e[i].c!=p[po]) p[++po]=e[i].c;
		}
		for(int i=1;i<=po;i++){
			if(p[i]-1==p[i-1]){
				pr=p[i];
			}
			else{
				k[tot].l=pl,k[tot].r=pr;
				pl=pr=p[i];
				tot++;
			}
		}
		k[tot].l=pl,k[tot].r=pr;
		if(!fl){
			printf("0\n");
//			cout<<"______\n";
			continue;
		}
		ll st=1,ans=1;
		for(int i=1;i<=tot;i++){
			ans=ans*ksm(s1,k[i].l-st)%mod;
			ans=ans*ksm(s2,k[i].r-k[i].l)%mod;
			st=k[i].r;
		}
		ans=ans*ksm(s1,n-k[tot].r)%mod;
		printf("%lld\n",ans);
//		cout<<tot<<"\n";
//		for(int i=1;i<=tot;i++) cout<<k[i].l<<" "<<k[i].r<<"\n";
//		cout<<"______\n";
	}
	return 0;
}
/*
判断0的情况：如果有c(i) 相等但d(i)不等

对于一个一元条件连续段S，它能完全影响|S|-1个二元连续段，半影响2个连续段 

被完全影响的二元条件只能有一种可能

没有被影响的二元条件除了第一个位置可以是v^2之外其他都是v 

前面的半影响二元条件也只有一种可能但后面的有v种可能 

但是还有一个“不影响”因素，因此要继续考虑 

考虑块内影响。

合法	
1.f(i)=a(i)且f(i+1)==b(i)
2.f(i)!=a(i) 

当要有条件满足情况一时，若要有x个条件，则最多x-1相交，最少max(0,2x-n)交点。

可以成为交点的点只有n-2个，直接组合数可求

块的前面和后面实际上都没有影响 ，一定能找到一个方案满足。 

接下来考虑块内容斥。

那么首先枚举块内要满足几次情况一，同时枚举交点有几个

考虑快速计算。

当选择x个条案件满足情况一，剩余条件为(n-1)-x 

那min k=0,max k=(n/2>=x ? x-1 : 0)

被限制的条件只能贡献(v^2-v+1)

块长为n，则块的贡献为

for(i=0~n-1){
	ans=ans+pow(v^2-v,n-1-i)*C(n-1,i);
}
*/
