#include<iostream>
#include<map>
#include<cstring>
#include<algorithm>
#define ll long long
#define endl '\n'
using namespace std;
const ll MOD=1e9+7;
const int maxn=1e6+10;
map<int,int>mp;
int c[maxn];
ll dp[maxn],f[maxn],g[maxn];
ll mul(ll a,ll b){
	ll res=1;
	a%=MOD;
//	cout<<a<<' '<<b<<' ';
	while(b){
		if(b&1)res=res*a%MOD;
		a=a*a%MOD;
		b>>=1;
	}
//	cout<<res<<endl;
	return res%MOD;
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int T;
	cin>>T;
	while(T--){
		ll ans=1;
		int n,m,v;
		cin>>n>>m>>v;
		mp.clear();
		bool flag=true;
		int cnt1,cnt2,cnt3;
		memset(c,0,sizeof(c));
		for(int i=1;i<=m;++i){
			int id,x;
			cin>>id>>x;
			c[i]=id;
			if(mp[id]!=0&&mp[id]!=x)flag=false;
			mp[id]=x;
		}
		if(!flag){
			cout<<0<<endl;
			continue;
		}
		sort(c+1,c+m+1);
		m=unique(c+1,c+m+1)-c-1;
		cnt1=n-1,cnt2=0,cnt3=0;
		/*
		? ? v*v
		a ? v*v
		a b v*v-v+1
		*/
		if(c[1]!=1){
			cnt1--;
			cnt2++;
		}
//		cout<<c[1]<<' ';
		for(int i=2;i<=m;++i){
			if(c[i-1]==c[i]-1){
				cnt1--;
				cnt3++;
			}else{
				cnt1-=2;
				cnt2+=2;
			}
//			cout<<c[i]<<' ';
		}
		if(c[m]!=n){
			cnt1--;
			cnt2++;
		}
//		cout<<cnt1<<' '<<cnt2<<' '<<cnt3<<endl;
		ans=ans*mul(1ll*v*v%MOD,cnt1)%MOD;
		ans=ans*mul(1ll*v*v%MOD,cnt2)%MOD;
		ans=ans*mul(1ll*(v*v%MOD+MOD-v+1)%MOD,cnt3)%MOD;
		cout<<ans<<endl;
//		cout<<(1ll*16*1024*9)<<endl;
//		dp[1]=f[1]=g[1]=1;
//		for(int i=2;i<=n;++i){
//			if(mp[i]!=0){
//				if(mp[i-1])dp[i]=dp[i-1]*(v*v%MOD+MOD-v+1)%MOD;
//				else dp[i]=dp[i-1]*v%MOD*v%MOD;
//			}else{
//				if(mp[i-1])dp[i]=dp[i-1]*
//			}
//		}
//		cout<<dp[n]<<endl;
	}
	return 0;
}
/*
1
10 11 2
10 2
7 2
7 2
2 2
3 2
4 2
10 2
7 2
10 2
3 2
3 2

622513748
547054119
935264382
797858048
656531230
561087816
0
0
0
104354915


*/
