#include <bits/stdc++.h>
using namespace std;
const int M=1e5+10;
const long long MOD=1e9+7;
int m;
long long n,v;
struct Limit{
	long long c,d;
}a[M];
bool cmd(Limit x,Limit y)
{
	return x.c<y.c;
}
long long qpow(long long x,long long y)
{
	if(x==0)
		return 0;
	if(y==0)
		return 1;
	if(y%2)
		return qpow(x*x%MOD,y/2)*x%MOD;
	else
		return qpow(x*x%MOD,y/2)%MOD;
}
long long Solve(long long l)
{
	if(l==1)
		return 1ll;
	return (qpow(v*v%MOD,l-1)-qpow(v,l-2)*(v-1)%MOD)%MOD;
}
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--)
	{
		n=0,m=0,v=0;
		scanf("%lld%d%lld",&n,&m,&v);
		for(int i=1;i<=m;i++)
			scanf("%lld%lld",&a[i].c,&a[i].d);
		sort(a+1,a+m+1,cmd);
		long long ans=1ll;
		for(int i=2;i<=m;i++)
		{
			if(a[i].c==a[i-1].c&&a[i].d!=a[i-1].d)
			{
				ans=0ll;
				break;
			}
		}
//		if(T==0)
//		{
//			bool check=0;
//			printf("Checking");
//		}
		for(int i=2;i<=m;i++)
		{
			ans*=Solve(a[i].c-a[i-1].c+1);
			ans%=MOD;
		}
		ans*=qpow(v*v%MOD,a[1].c-1);
		ans%=MOD;
		ans*=qpow(v*v%MOD,n-a[m].c);
		ans%=MOD;
		printf("%lld\n",(ans+MOD)%MOD);
	}
	return 0;
}
