#include<bits/stdc++.h>
using namespace std;
const int N=100010,mod=1e9+7;
struct Node{
	int c,d;
}lim[N];
map<int,int> vis;
typedef long long LL;
bool cmp(Node x,Node y){
	return x.c<y.c;
}
bool cmp2(Node x,Node y){
	return x.c==y.c;
}
LL qpow(LL a,LL b){
	if(!b)return 1;
	LL res=1;
	while(b){
		if(b&1)res=res*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return res;
}
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int t,n,m,v;
	scanf("%d",&t);
	while(t--){
		vis.clear();
		scanf("%d%d%d",&n,&m,&v);
		int flag=1;
		LL v2=1ll*v*v%mod;
		for(int i=1;i<=m;i++){
			scanf("%d%d",&lim[i].c,&lim[i].d);
			if(!vis[lim[i].c]){
				vis[lim[i].c]=lim[i].d;
			}else if(vis[lim[i].c]!=lim[i].d){
				flag=0;
			}
		}
		if(!flag){
			printf("0\n");
			continue ;
		}
		sort(lim+1,lim+1+m,cmp);
		m=unique(lim+1,lim+1+m,cmp2)-lim-1;
		LL res=qpow(v2,lim[1].c-1);
		for(int i=2;i<=m;i++){
			res=res*(qpow(v2,lim[i].c-lim[i-1].c)-1ll*(v-1)*qpow(v,lim[i].c-lim[i-1].c-1)%mod+mod)%mod;
		}
		res=res*qpow(v2,n-lim[m].c)%mod;
		printf("%lld\n",res);
	} 
	return 0;
}
