#include<iostream>
#include<cstdio>
#include<algorithm>
#define lld long long
using namespace std;
const int N=2e5+5,p=1e9+7;
lld qpow(lld a,int y=p-2){
	a%=p;
	lld res=1;
	for(;y;y>>=1,a=a*a%p) if(y&1) res=res*a%p;
	return res;
}
int T;
int n,m;lld V;
struct node{int pos,v;}b[N];
lld f[N],g[N];
//f表示没钦定
//g表示钦定 
bool cmp(node a,node b){return a.pos<b.pos;}
void Add(lld &A,lld b){
	A=(A+b)%p;
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%d",&T);
	while(T--){
		scanf("%d%d%lld",&n,&m,&V);
		lld V2=1ll*V*V%p;
		for(int i=1;i<=m;i++) scanf("%d%d",&b[i].pos,&b[i].v);
		sort(b+1,b+m+1,cmp);
		bool ok=true;
		f[1]=qpow(V2,b[1].pos-1)*(V-1)%p;
		g[1]=qpow(V2,b[1].pos-1)%p;
		for(int i=2;i<=m;i++){
			f[i]=g[i]=0;
			if(b[i].pos==b[i-1].pos){
				if(b[i].v==b[i-1].v){
					f[i]=f[i-1],g[i]=g[i-1];
					continue;
				}
				ok=false;break;
			}
			else{
				int len=b[i].pos-b[i-1].pos-1;
				Add(g[i],f[i-1]*V%p*qpow(V2,len)%p);
				if(len==0) Add(g[i],g[i-1]);
				else{
					lld f1=qpow(V2,len),f2=qpow(V,len);
					f1=(f1-f2+p)%p;
					Add(g[i],g[i-1]*(f1*V%p+f2)%p);
				}	
			}
			f[i]=g[i];
			if(b[i].pos<n) f[i]=1ll*f[i]*(V-1)%p;
		}
		if(!ok){printf("0\n");continue;}
		lld now=(f[m]+g[m])%p;
		if(b[m].pos<=n-1) printf("%lld\n",now*qpow(V2,n-1-b[m].pos)%p*V%p);
		else printf("%lld\n",f[m]);
	}
}
