#include<bits/stdc++.h>
using namespace std;
#define int long long
const int M=1e5+10,N=1e6+10,mod=1e9+7;
int T; 
int n,m,v;
struct NODE{
	int c,d;
}nd[M];
bool cmp(const NODE&A,const NODE&B){
	return A.c<B.c;
}
int qpow(int x,int k){
	if(k==0)return 1;
	if(k==1)return x;
	int r=qpow(x,k>>1);
	r=r*r%mod;
	if(k%2)r=r*x%mod;
	return r;
}
int dp[N][2];
bool xz[N];
signed main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	cin>>T;
	int CC=T;
	while(T--){
	//	if(T!=CC-1)continue;
		cin>>n>>m>>v;
		for(int i=1;i<=m;i++){
			int c,d;cin>>c>>d;
			nd[i]=NODE{c,d};
		}
		sort(nd+1,nd+m+1,cmp);
		int tot=0;
		nd[m+1]=NODE{0,0};
		bool pd=false;
		for(int i=1;i<=m;i++){
			if(nd[i].c==nd[i+1].c&&nd[i].d!=nd[i+1].d){
				cout<<0<<endl;
				pd=true;
				break;
			}
			if(nd[i].c!=nd[i+1].c||nd[i].d!=nd[i+1].d){
				nd[++tot]=nd[i];
			}
		}
		if(pd)continue;
		m=tot;
		int ans=1;
		int m0=(v*v-v)%mod,m1=(v*v-v+1)%mod,m2=v*v%mod;
	//	cout<<"n:"<<n<<endl;
		if(m==1){
			cout<<qpow(m2,n-m)<<endl;
			continue;
		}else if(m==n){
			cout<<qpow(m1,m-1)<<endl;
			continue;
		}else{
			if(n>1e6){
				cout<<0<<endl;
				continue;
			}
			memset(dp,0,sizeof dp);
			ans=qpow(m2,nd[1].c-1);
			for(int i=1;i<m;i++){
				dp[nd[i].c][0]=0;
				dp[nd[i].c][1]=ans;
				for(int j=nd[i].c;j<nd[i+1].c;j++){
					(dp[j+1][0]+=dp[j][1]*m0%mod+dp[j][0]*m2%mod)%=mod;
					(dp[j+1][1]+=dp[j][1]*(j<nd[i+1].c-1?v:1)%mod)%=mod;
				}
				ans=dp[nd[i+1].c][0]+dp[nd[i+1].c][1];
				ans%=mod;
			}
			ans=ans*qpow(m2,n-nd[m].c)%mod;
			cout<<ans<<endl;
		}
	}
	return 0;
}
