#include<bits/stdc++.h>
#define N 100010
#define Pii pair<int,int>
#define Fi first
#define Se second
using namespace std;
// char ch[1<<21],*p1=ch,*p2=ch;
// #define getchar() (p1==p2&&(p2=(p1=ch)+fread(ch,1,1<<21,stdin),p1==p2)?EOF:*p1++)
// inline bool Isdigit(char c){return c>='0'&&c<='9';}
// template<typename T>inline void read(T &x){
	// x=0;char c=getchar();bool f=0;
	// while(!Isdigit(c)){if(c=='-')f=1;c=getchar();}
	// while(Isdigit(c))x=(x<<3)+(x<<1)+(c^48),c=getchar();
	// x=f?-x:x;
// }
// template<typename T,typename ...Args>
// inline void read(T &x,Args &...args){read(x),read(args...);}
const int Mod=1e9+7;
inline int Qpow(int a,int b){
	if(b<0)return 1;
	int Res=1;
	while(b){
		if(b&1)Res=1LL*Res*a%Mod;
		a=1LL*a*a%Mod;
		b>>=1;
	}
	return Res;
}
Pii a[N];
int T,n,m,V;
void Solve(){
	scanf("%d%d%d",&n,&m,&V);
	for(int i=1;i<=m;i++)
		scanf("%d%d",&a[i].Fi,&a[i].Se);
	sort(a+1,a+m+1);
	int Res=Qpow(V,(a[1].Fi-1)<<1);
	for(int i=1;i<m;i++){
		if(a[i].Fi==a[i+1].Fi){
			if(a[i].Se==a[i+1].Se)continue;
			else return puts("0"),void();
		}
		int Num=Qpow(V,(a[i+1].Fi-a[i].Fi)<<1);
		Num=(Num-1LL*Qpow(V,a[i+1].Fi-a[i].Fi-1)*(V-1)%Mod+Mod)%Mod;
		Res=1LL*Res*Num%Mod;
	}
	if(a[m].Fi<n)Res=1LL*Res*Qpow(V,(n-a[m].Fi)<<1)%Mod;
	printf("%d\n",Res);
}
int main(){
	froepen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%d",&T);
	while(T--)
		Solve();
}