#include <bits/stdc++.h>
using namespace std;
#define il inline
#define pb push_back
using ll=long long;
using pii=pair<int,int>;
#define fi first
#define se second
const int M=1e6+5,mod=1e9+7;
int n,m;
ll V;
pii c[M],a[M];
ll f[M][2];
unordered_map<int,int> vis;
int tot;
struct matrix {
	ll a[3][3];
	matrix() {memset(a,0,sizeof(a));}
	ll* operator[](int i) {return a[i];}
	friend matrix operator*(matrix A,matrix B) {
		matrix C;
		for(int i=1;i<=2;i++) {
			for(int j=1;j<=2;j++) {
				for(int k=1;k<=2;k++) {
					(C[i][j]+=A[i][k]*B[k][j]%mod)%=mod;
				}
			}
		}
		return C; 
	}
}bs;
il matrix qpow(matrix A,ll b) {
	matrix res;res[1][1]=res[2][2]=1;
	for(;b;b>>=1,A=A*A)
		if(b&1) res=res*A;
	return res;
}
int main() {
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int _;scanf("%d",&_);
	while(_--) {
		scanf("%d%d%lld",&n,&m,&V);
		tot=0;
		bs=matrix();
		bs[1][1]=V*V%mod;bs[1][2]=V*(V-1)%mod;
		bs[2][2]=V;
		vis.clear();
		for(int i=1;i<=m;i++) scanf("%d%d",&c[i].fi,&c[i].se);
		bool bj=0;
		for(int i=1;i<=m;i++) {
			if(vis[c[i].fi]&&vis[c[i].fi]!=c[i].se) {
				bj=1;
				break;
			}
			else vis[c[i].fi]=c[i].se;
		}
		if(bj) {
			puts("0");
			continue;
		}
		sort(c+1,c+1+m);
		m=unique(c+1,c+1+m)-c-1;
		if(c[1].fi!=1) a[++tot]={0,1};
		for(int i=1;i<=m;i++) {
			if(c[i].fi!=1&&c[i].fi-1!=c[i-1].fi) a[++tot]={0,c[i].fi-1};
			a[++tot]={c[i].se,c[i].fi};
			if(c[i].fi!=n&&(i==m||c[i].fi+1!=c[i+1].fi)) a[++tot]={0,c[i].fi+1};
		}
		if(a[tot].se!=n) a[++tot]={0,n};
		f[1][0]=1;
		for(int i=2;i<=tot;i++) {
			if(a[i].fi) {
				if(a[i-1].fi) {
					f[i][0]=(f[i-1][0]+f[i-1][1])*(V-1)%mod*V%mod;
					f[i][1]=(f[i-1][0]+f[i-1][1])%mod;
				}
				else {
					f[i][0]=(f[i-1][0]*V%mod*V%mod+f[i-1][1]*(V-1)%mod*V%mod)%mod;
					f[i][1]=f[i-1][1];
				}
			}
			else {
				if(a[i-1].fi) {
					f[i][0]=(f[i-1][0]+f[i-1][1])*(V-1)%mod*V%mod;
					f[i][1]=(f[i-1][0]+f[i-1][1])*V%mod;
				}
				else {
					matrix t=qpow(bs,a[i].se-a[i-1].se);
					matrix cur;cur[1][1]=f[i-1][0],cur[2][1]=f[i-1][1];
					cur=t*cur;
					f[i][0]=cur[1][1],f[i][1]=cur[2][1];
				}
			}
		}
		printf("%lld\n",(f[tot][0]+f[tot][1])%mod);
	}
	return 0;
}
/*
zsyz&xwb rp++
*/
