#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int N=1e5+5;
int n,m;
long long v;
int c[N],d[N];
struct ooo
{
	long long x;
	long long y;
}e[N];
long long ans=1,mod=1e9+7;
long long quick(long long x,long long p)
{
	long long s=1,bas=p;
	while(x)
	{
		if(x&1)
		s*=bas;
		bas*=bas;
		s=s%mod;
		bas=bas%mod;
		x>>=1;
	}
	return s;
}
bool cmp(ooo x,ooo y)
{
//	if(x.x<y.x)
	return x.x<y.x; 
}
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int t;
	cin>>t;
	while(t--)
	{
		ans=1;
	scanf("%d%d%lld",&n,&m,&v);
//	long long ch=1;
//	for(int i=1;i<n;i++)
//	{
//		ch*=(v*v-1);
//		ch%=mod;
//	}
//	cout<<ch<<endl;
	for(int i=1;i<=m;i++)
	{
		scanf("%d%d",&c[i],&d[i]);
		e[i]=(ooo){c[i],d[i]};
	}
	sort(e+1,e+m+1,cmp);
	bool fl=0;
	for(int i=1;i<m;i++)
	{
		if(e[i].x==e[i+1].x&&e[i].y!=e[i+1].y)
		fl=1;
	}
	if(fl)
	{
		printf("0\n");
		continue;
	}
	sort(c+1,c+m+1);
	m=unique(c+1,c+m+1)-c-1;
	ans*=quick(c[1]-1,(v*v)%mod);
	ans%=mod;
	ans*=quick(n-c[m],(v*v)%mod);
	ans%=mod;
//	for(int i=1;i<c[1];i++)
//	{
//		ans*=(v*v%mod);
//		ans%=mod;
//	}
//	for(int i=c[m];i<n;i++)
//	{
//		ans*=(v*v);
//		ans%=mod;
//	}
	for(int i=1;i<m;i++)
	{
		long long s1=1,s2=1;
//		bool fl=0;
		s1*=quick(c[i+1]-2-c[i]+1,v%mod);
		s1%=mod;
		s1*=(v-1);
		s1%=mod; 
		s2*=quick(c[i+1]-c[i],(v*v)%mod);
//		for(int j=c[i];j<c[i+1]-1;j++)
//		{
//			s1*=v;
//			s1=s1%mod;
//		}
//		for(int j=c[i];j<c[i+1];j++)
//		{
//			s2*=(v*v);
//			s2=s2%mod;
//		}
		ans*=((s2-s1+mod)%mod);
		ans=ans%mod;
	}
	printf("%lld\n",ans);
	}
	
	return 0;
}
