#include<bits/stdc++.h>
using namespace std;
long long T,n,m,v,M=1000000007,g[1000010],qwe,vv[500];
struct ab{
	long long a,b;
}x[1000010];
bool cmp(ab x,ab y)
{
	if(x.a<y.a) return 1;
	return 0; 
}
long long mi(long long a)
{
	long long x=1,i=0;
	while(a>0)
	{
		if(a%2==1)
		{
			x=x*vv[i]%M;
		}
		i++;
		a/=2;
	}
	return x;
}
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%lld",&T);
	for(int t=1;t<=T;t++)
	{
		long long flag=0,qwe=0;
		memset(g,0,sizeof(g));
		scanf("%lld%lld%lld",&n,&m,&v);vv[0]=v%M;
		for(int i=1;i<=100;i++)
		{
			vv[i]=vv[i-1]*vv[i-1]%M;
		}
		for(long long i=1;i<=m;i++)
		{
			scanf("%lld%lld",&x[i].a,&x[i].b);
		}
		if(m==1)
		{
			long long q=1;
			q=q*mi(2*n-2)%M;
			printf("%lld\n",q);
			continue;
		}
		sort(x+1,x+m+1,cmp);
		for(long long i=1;i<m;i++)
		{
			if(x[i].a==x[i+1].a && x[i].b!=x[i+1].b)
			{
				flag=1;
				break;
			}
		}
		if(flag==1)
		{
			printf("0\n");
			continue;
		}
		for(int i=1;i<=m;i++)
		{
			if(x[i].a!=x[i-1].a) g[++qwe]=i;
		}
		long long sum=1;
		sum=sum*mi(2*g[1]-2)%M;
		for(int i=1;i<qwe;i++)
		{
			int cha=g[i+1]-g[i];
			long long al=1;
			al=al*mi(2*cha)%M;
			long long as=v-1;
			as=as*mi(cha-1)%M;
			if(al<as) al+=M;
			sum=(sum*(al-as))%M;
		}
		sum=sum*mi(2*n-2*g[qwe])%M;
		printf("%lld\n",sum);
	}
}
