#include<bits/stdc++.h>
using namespace std;
long long a;
long long b;
long long n;
long long t;
long long m;
long long v;
long long x,y;
struct node{
	long long xia;
	long long zhi;
}flag[1000001];
long long oo;
long long ans;
const long long mod=1000000007;
long long cnt1;
long long cnt2;
int flag1;
long long quick_pow(long long q,long long w){
	if(w==0){
		return 1;
	}
	long long p=w>>1;
	long long k=quick_pow(q,p);
	if(w%2==0){
		return (k*k)%mod;
	}
	else{
		return (((k*k)%mod)*q)%mod;
	}
}
long long cmp(node q,node w){
	return q.xia<w.xia;
}
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	cin>>t;
	while(t--){
//		cout<<t<<"!"<<":"<<endl; 
		cnt1=0;
		cnt2=0;
		ans=1;
		oo=0;
		flag1=0;
//		long long ww=(v*v-v+1)%mod;
		memset(flag,0,sizeof flag);
		cin>>n>>m>>v;
		for(int i=1;i<=m;i++){
			cin>>x>>y;
			flag[++oo].xia=x;
			flag[oo].zhi=y;
		}
		sort(flag+1,flag+1+m,cmp);
		for(int i=2;i<=m;i++){
//			if(flag[i-1].xia==flag[i].xia-1){
//				ans*=ww;
//				ans%=mod;
//				continue;
//			}
//			cout<<ans<<endl;
			if(flag[i-1].xia==flag[i].xia){
				if(flag[i-1].zhi!=flag[i].zhi){
					cout<<"0"<<endl;
					flag1=1;
					break;
				}
				continue;
			}
			long long sum=ans;
			sum*=(v-1);
			sum%=mod;
			sum*=quick_pow(v,flag[i].xia-flag[i-1].xia-1);
//			cout<<sum<<"!"<<endl;
			sum%=mod;
			ans*=quick_pow(v,2*(flag[i].xia-flag[i-1].xia));
			ans-=sum;
			ans+=mod;
			ans%=mod;
//			cout<<ans<<endl;
		}
		if(flag1==1){
			continue;
		}
		ans*=quick_pow(v,2*(n-flag[m].xia));
		ans%=mod;
		ans*=quick_pow(v,2*(flag[1].xia-1));
		ans%=mod;
		cout<<ans<<endl;
	}
	return 0;
}

