#include<bits/stdc++.h>
using namespace std;
#define int long long 
const int N=5e5+10;
const int mod=1e9+7;
int n,ans,t,m,v;
struct nina{
	int pos,data;
	inline bool operator<(const nina &a)const{
		return pos<a.pos;
	}
}p[N];

inline int q_pow(int a,int n){
//	cerr<<"q_pow"<<a<<" "<<n<<endl;
	int res=1;
	while(n){
		if(n&1)res=res*a%mod;
		a=a*a%mod;
		n>>=1;
	}
	return res;
}
inline int get_sum(int v,int x){
//	cerr<<"get_sum"<<v<<" "<<x<<endl;
	return (q_pow(v,x+1)+mod-1)%mod*(q_pow(v-1,mod-2)+mod)%mod;
}
inline void init(){
	ans=1;
}
inline int read(){
	int res=0;bool s=0;char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')s=1;
	for(;isdigit(c);c=getchar())res=(res<<3)+(res<<1)+(c^48);
	return s?-res:res;
}
signed main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	t=read();
	while(t--){
		n=read();m=read();v=read();
		init();
		for(int i=1;i<=m;i++){
			p[i].pos=read();p[i].data=read();
		}
		sort(p+1,p+m+1);
//		for(int i=1;i<=m;i++){
//			cerr<<p[i].pos<<" "<<p[i].data<<endl;
//		}
		ans=ans*q_pow(v,2*p[1].pos-2)%mod;
		for(int i=2;i<=m;i++){
//			cerr<<"i:"<<i<<endl;
//			cerr<<"pos:"<<p[i-1].pos<<" "<<p[i].pos<<endl;
			if(p[i].pos==p[i-1].pos){
				if(p[i].data!=p[i-1].data){
//					cerr<<"error"<<endl;
					ans=0;
					break;
				}
				else continue;
			}
			int len=p[i].pos-p[i-1].pos;
			ans=(ans*(q_pow(v,2*len)-q_pow(v,len-1)*(v-1)%mod+mod ) )%mod;
		}
		ans=ans*q_pow(v,2*(n-p[m].pos))%mod;
		printf("%lld\n",ans);
	}
	return 0;
}
