#include<bits/stdc++.h>
using namespace std;
#define int long long
/*
还真是数学题吧  

先考虑无解情况：明显只有 a[i].c = a[j].c 且 a[i].d != a[j].d 时无解

它问的是 (ai,bi) 的方案数 

因为一个点只会影响到下一个点，所以可能可以只考虑两个相邻的点的关系就行，算出方案数后相乘就好 
哎还是不能只考虑两个点，因为是链式法则了，所以考虑做 dp 转移方程了： 
 
1. i 和 i-1 的值已经被确定，那么方案数为 v*(v-1)+1 
2. i 和 i-1 没有全确定，方案数应该是：v*v

总之，除非两个都被确定，不然就要 *v*v，而两个都确定了就应该是 *(v*(v-1)+1) 
那又注意到大家都是乘法，而且乘的数字都是一样的，不如直接快速幂解决 

还是有问题，可能是推式子推错了  

发现如果一个空的被夹住了，那么这种方案可不是 (v*v)*(v*v)，而是2v^3-2v^2+v 
总不能全部式子都不是这样吧，那就爆炸了啊  

还真爆炸了啊 

压根式子都不一样，乱写的结果是这样的  
*/

const int maxm=1e5+10;
const int mod=1e9+7;
int T;
int n,m,v;
struct S{
	int c,d;
}a[maxm]; 

bool cmp(S x,S y)
{
	return x.c<=y.c;
}

int quick_pow(int a,int b)
{
	int res=1;
	while(b>0)
	{
		if(b&1) res=res*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return res%mod;
}

signed main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%lld",&T);
	while(T--)
	{
		int k1=0,k2=0;
		bool flag=0;
		scanf("%lld%lld%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,cmp);
		for(int i=1;i<m;i++)
		{
			if(a[i].c==a[i+1].c&&a[i].d!=a[i+1].d)
			{
				flag=1;
				break;
			}
		}
		if(flag)
		{
			cout<<0<<'\n';
			continue;
		}
		for(int i=1;i<m;i++) // 判断有多少是两个都被确定的  
		{
			if(a[i].c==a[i+1].c-1)
				k1++;
		}
		for(int i=1;i<m;i++)
		{
			if(a[i].c==a[i+1].c-2)
				k2++;
		}
		int res1=v*v%mod,res2=(v*(v-1)%mod)+1,res3=((((v+2*quick_pow(v,3)%mod)%mod)-2*v%mod*v%mod)+mod)%mod;
		cout<<((quick_pow(res1,n-1-k1-2*k2)*quick_pow(res2,k1))%mod*quick_pow(res3,k2))%mod<<'\n';
	}
	return 0;
}
