#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int N=1e5+5,mod=1e9+7;
int T,n,m,len; LL ans,V;
struct limit { int pos,val; } q[N];
bool cmp(limit a,limit b) { return a.pos<b.pos; }
LL sum[N],ok[N];
LL qpow(LL a,LL b)
{
	if(b<0) return 1;
	LL ret=1;
	while(b) { if(b&1) ret=ret*a%mod; b>>=1; a=a*a%mod; }
	return ret;
}
void Solve(int l,int r,int vl,int vr)
{
	if(l>r) return ;
	sum[++len]=qpow(V,r-l)*(V-1)%mod; // 这一段不满足的方案
	ok[len]=(qpow(V*V%mod,r-l+1)-sum[len]+mod)%mod;
}
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%d",&T);
	while(T--)
	{
		len=ans=0;
		scanf("%d%d%lld",&n,&m,&V);
		for(int i=1;i<=m;i++) scanf("%d%d",&q[i].pos,&q[i].val);
		sort(q+1,q+1+m,cmp);
		ok[0]=qpow(V*V%mod,q[1].pos-1);
		for(int i=1;i<m;i++)
		{
			if(q[i].pos==q[i+1].pos&&q[i].val!=q[i+1].val) { ans=-1; break; }
			if(q[i].pos!=q[i+1].pos) Solve(q[i].pos,q[i+1].pos-1,q[i].val,q[i+1].val);
		}
		if(ans==-1) { puts("0"); continue; }
		ok[len+1]=qpow(V*V%mod,n-q[m].pos);
		ans=1;
		for(int i=0;i<=len+1;i++) ans=ans*ok[i]%mod;
		printf("%lld\n",ans);
//		for(int i=0;i<=len+1;i++) cout<<ok[i]<<" "; puts("");
//		for(int i=0;i<=len+1;i++) cout<<sum[i]<<' '; puts("");
	}
	return 0;
}
/*
1
10 5 2
2 2
3 2
4 2
7 2
10 2
*/
