#include<bits/stdc++.h>
using namespace std;
const long long mod=1e9+7;
struct datay
{
	int x;
	long long v;
}a[100005];
long long m,n,k,f[100005]; 
bool cmp1(datay q,datay w){return q.x<w.x;}
long long poww(long long x,long long y)
{
	long long h=1;
	while(y)
	{
		if(y&1)h=(h*x)%mod;
		x=(x*x)%mod,y>>=1;
	}
	return h;
}
void poi()
{
	scanf("%lld%lld%lld",&n,&m,&k);
	if(k==1){printf("1\n");return;}
	for(int i=1;i<=m;i++)scanf("%d%lld",&a[i].x,&a[i].v);
	sort(a+1,a+m+1,cmp1);
	for(int i=2;i<=m;i++)
		if(a[i].x==a[i-1].x&&a[i].v!=a[i-1].v)
		{
			printf("0\n");
			return;
		}
	f[1]=poww(k,a[1].x*2-2);
	for(int i=2;i<=m;i++)
	{
		if(a[i].x==a[i-1].x)f[i]=f[i-1];
		else f[i]=f[i-1]*(poww(k,(a[i].x-a[i-1].x)*2)-poww(k,a[i].x-a[i-1].x-1)*(k-1)%mod+mod)%mod;
	}
//	cout<<f[1]<<' '<<f[2]<<'\n';
	printf("%lld\n",f[m]*poww(k,n*2-a[m].x*2)%mod);
	return;
}
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int qwe;
	scanf("%d",&qwe);
	for(int i=1;i<=qwe;i++)poi();







  return 0;
}

