#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll MOD=1e9+7;
int n,m,v;
pair<int,int> yksk[114514];

bool compyksk(pair<int,int> x,pair<int,int> y)
{
	return x.first<y.first;
}

ll fastpow(ll x,ll e)
{
	ll res=1,y=x;
	while(e)
	{
		if(e%2==1) res=(res*y)%MOD;
		e>>=1,y=(y*x)%MOD;
	}
	return res;
}

void work()
{
	scanf("%d%d%d",&n,&m,&v);
	
	for(int i=1;i<=m;i++)
	{
		int c,d;
		scanf("%d%d",&c,&d);
		yksk[i]=make_pair(c,d);
	}
	sort(yksk+1,yksk+m+1,compyksk);
	for(int i=1;i<m;i++)
	{
		if(yksk[i].first==yksk[i+1].first&&yksk[i].second!=yksk[i+1].second)
		{
			printf("0\n");
			return ;
		}
	}
	if(m==n)
	{
		ll ans=1;
		for(int i=2;i<=n;i++)
		ans=(ans*((v-1)*v%MOD+1)%MOD)%MOD;
		printf("%lld\n",ans);
		return ;
	}
	if(m==1)
	{
		ll ans=1;
		for(int i=2;i<=n;i++)
		ans=(ans*(v*v)%MOD)%MOD;
		printf("%lld\n",ans);
		return ;
	}
	
	ll ans=1ll;
	for(int i=2;i<=yksk[1].first;i++)
	ans=(ans*(v*v)%MOD)%MOD;
	for(int i=2;i<=m;i++)
	{
		if(yksk[i]==yksk[i-1]) continue;
		ll xp=1,yp=1;
		for(int j=1;j<=2*(yksk[i].first-yksk[i-1].first-2)+1;j++)
		xp=(xp*v)%MOD;
		for(int j=1;j<=yksk[i].first-yksk[i-1].first;j++)
		yp=(yp*(v*v))%MOD;
		if(yp==xp&&xp==1) continue;
		ans=(ans*(yp+MOD-xp))%MOD;
	}
	for(int i=yksk[m].first+1;i<=n;i++)
	ans=(ans*(v*v))%MOD;
	printf("%lld\n",(ans+MOD)%MOD);
}
int main()
{
	int t;
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%d",&t);
	while(t--)
	work();
	return 0;
}
/*

1
5 1 2
1 2

*/
