#include <bits/stdc++.h>

using namespace std;

const int mod=1e9+7;
const int maxn=1e5+5;
map<int,int> mp;
vector<int> vec;

int qpow(int x,int y){
	int res=1;
	while(y){
		if(y&1) res=1ll*res*x%mod;
		x=1ll*x*x%mod;
		y>>=1;
	}
	return res;
}

int main(){
	
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	
	int q;
	
	scanf("%d",&q);
	
	while(q--){
		int n,m,v;
		scanf("%d %d %d",&n,&m,&v);
		int tmp=1ll*v*v%mod;
		if(!m){
			printf("%d\n",qpow(tmp,n-1));
			continue;
		}
		vec.clear();
		mp.clear();
		bool flag=1;
		for(int i=1;i<=m;i++){
			int x,y;
			scanf("%d %d",&x,&y);
			if(!flag) continue;
			if(mp[x]&&mp[x]!=y){
				flag=0;
				continue;
			}
			if(!mp[x]) vec.push_back(x);
			mp[x]=y;
		}
		if(!flag){
			puts("0");
			continue;
		}
		sort(vec.begin(),vec.end());
		int res=1;
		// for(int x : vec) printf("%d ",x);
		// puts("");
		res=1ll*res*qpow(tmp,vec[0]-1)%mod;
		for(int j=1;j<(int)vec.size();j++){
			int k=vec[j]-vec[j-1];
			int tt=(qpow(tmp,k)-1ll*qpow(v,k-1)*(v-1)%mod+mod)%mod;
			res=1ll*res*tt%mod;
		}
		res=1ll*res*qpow(tmp,n-vec.back())%mod;
		printf("%d\n",res);
	}
	
	return 0;
}