#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=1e5+5;
const int mod=1e9+7;
int t,n,m,v,cnt,f[N];
bool flag;
struct node{
	int c,x;
}d[N];
bool cmp(node a,node b){
	if(a.c!=b.c) return a.c<b.c;
	return a.x<b.x;
}
int qpow(int x,int y){
	if(!y) return 1;
	int tmp=qpow(x,y>>1);
	if(y&1) return tmp*tmp%mod*x%mod;
	return tmp*tmp%mod;
}
signed main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%lld",&t);
	while(t--){
		scanf("%lld%lld%lld",&n,&m,&v);
		for(int i=1;i<=m;i++) scanf("%lld%lld",&d[i].c,&d[i].x);
		sort(d+1,d+m+1,cmp);
		cnt=0;
		for(int i=1;i<=m;i++) if(!cnt||d[i].c!=d[cnt].c||d[i].x!=d[cnt].x) d[++cnt]=d[i];
		m=cnt;
		flag=0;
		for(int i=1;i<m;i++) if(d[i].c==d[i+1].c) flag=1;
		if(flag){
			printf("0\n");
			continue;
		}
		f[1]=qpow(v*v%mod,d[1].c-1);
		for(int i=2;i<=m;i++) f[i]=f[i-1]*((qpow(v*v%mod,d[i].c-d[i-1].c)-qpow(v,d[i].c-d[i-1].c-1)*(v-1)%mod+mod)%mod)%mod;
		printf("%lld\n",1ll*f[m]*qpow(v*v%mod,n-d[m].c)%mod);
	}
	return 0;
}
