#include<bits/stdc++.h>
using namespace std;
long long s=0,mo=1e9+7,T,n,m,k,z=0;
struct jg
{
	long long x,y;
}a[100100];
bool cp(jg a,jg b)
{
	if(a.x==b.x)
	{
		return a.y<b.y;
	}
	return a.x<b.x;	
} 
long long p(long long x,long long y)
{
	long long s=1;
	for(;y;y=y/2)
	{
		if(y&1)
		{
			s=(s*x)%mo;
		}
		x=(x*x)%mo; 
	}
	return s;
}
int main()
{
	//cout<<147456-129600;
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	//cout<<p(2,5);
	cin>>T;
	for(;T--;)
	{
		s=0;
		z=0;
		cin>>n>>m>>k;
		k=k%mo;
		for(int i=1;i<=m;i++)
		{
			scanf("%lld%lld",&a[i].x,&a[i].y);
		} 
		sort(a+1,a+m+1,cp);
		bool ok=1;
		int nm=1;
		for(int i=2;i<=m;i++)
		{
			if(a[i].x==a[nm].x&&a[i].y!=a[nm].y)
			{
				printf("%d\n",0);
				ok=0;
				break;
			}
			if(a[i].x!=a[nm].x)
			{
				a[++nm]=a[i];
			}
		}
		m=nm;
		if(ok)
		{
			if(m==n)
			{
				s=p((((k-1)*k)+1)%mo,n-1);
			}
			else
			{
				s=(p((k*k)%mo,n-m))%mo; 
				for(int i=1;i<m;i++)
				{
					if(a[i].x+1<a[i+1].x)
					{
						s=(s*((k*k)%mo)%mo);
					}
					else
					{
						s=(s*(((k*k-1))%mo)%mo);
					}
				}
				//cout<<n<<' '<<m<<' '<<k<<' ';	
			}
			printf("%d\n",s);
			//*p((k-1)*k);
		}
	}
	return 0;
}
