#include<bits/stdc++.h>
#define rg register 
#define step inline void
typedef unsigned long long ull;
typedef long long ll;
const int maxi=1e5+9;
const ull mod=1e9+7;
using namespace std;
ull T,N,M,V,c[maxi],d[maxi];
struct xxx{
	ull c,d;
}lim[maxi];
inline ull fpow(ull x,ull p){
	rg ull ans=1;x%=mod;
	for(;p;x=(x*x)%mod,p>>=1){
		if(p&1)ans=ans*x%mod;
	}
	return ans;
}
inline ull read(){
	rg ull x=0;rg char c=getchar();
	for(;!isdigit(c);c=getchar());
	for(;isdigit(c);x=(x<<3)+(x<<1)+(c^48),c=getchar());
	return x;
}
namespace _12345{
	ull ans=0;
	void dfs(){
		
	}
	step solve(){
		ans=0;
	}
}
namespace _6789{
	step solve(){
		printf("%llu\n",fpow(V*V%mod,N-1));
	}
}
namespace A{
	ull ans=0;
	step solve(){
		ans=0;
		ull tmp=(V*V-V+1)%mod;
		ans=fpow(tmp,N-1);
		printf("%llu\n",ans);
	}
}
bool cmp(xxx i,xxx j){return i.c<j.c;}
namespace T2{
	ull ans=0;ull len;
	step clear(){
		memset(c,0,sizeof c);
		memset(d,0,sizeof d);
		ans=0;
	}
	step getin(){
		N=read(),M=read(),V=read();
		for(rg ull i=1;i<=M;i++){
			lim[i].c=read(),lim[i].d=read();
		}
		sort(lim+1,lim+1+M,cmp);
	}
	bool check(){
		for(rg ull i=1;i<=M;i++){
			if(lim[i].c==lim[i-1].c&&lim[i].d!=lim[i-1].d)
			return 1;
		}
		return 0;
	}
	step statistics(){
		rg ull V2=V*V%mod;
		ans=fpow(V2,lim[1].c+N-1-lim[M].c);
		for(rg ull i=2,t1,t2,t3,dlt;i<=M;i++){
			dlt=lim[i].c-lim[i-1].c;
			if(dlt){
				t1=fpow(V2,dlt);
				t2=fpow(V,dlt-1)*(V-1)%mod;
				t3=t1+mod-t2;
				(t3<mod)?:t3-=mod;
				ans=ans*t3%mod;
			}	
		}
	}
	step output(){
		printf("%llu\n",ans);
	}
	step solve(){
		clear();
		getin(); 
		if(check()){puts("0");return;}
//		if(N<=12&&M<=12&&V<=2){
//			_12345::solve();return;
//		}
		if(M==1){
			_6789::solve();return;
		}
		if(M==N){
			A::solve();return;
		}
		statistics();
		output();
	}
	step init(){
		T=read();for(;T--;)solve();
	}
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	T2::init();
	return 0;
}
