#include<bits/stdc++.h>
#define int long long
using namespace std;
const int mod=1e9+7,M=100010;
int T,n,m,v,realm;
inline long long qpow(int x,int y)
{
	if(y==0)return 1;
	if(y==1)return x;
	long long t=qpow(x,y/2);
	if(y%2==0)return t*t%mod;
	return t*t%mod*x%mod;
}
struct node
{
	int c,d;
}a[M];
bool cmp(node a,node b)
{
	return a.c<b.c;
}
bool init()
{
	scanf("%lld%lld%lld",&n,&m,&v);
	realm=m;
	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=2;i<=m;i++)
	{
		if(a[i].c==a[i-1].c&&a[i].d!=a[i-1].d)
			return false;
		if(a[i].c==a[i-1].c&&a[i].d==a[i-1].d)
			realm--;
	}
	return true;
}
signed main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%lld",&T);
	while(T--)
	{
		if(!init())
		{
			printf("0\n");
			continue;
		}
		//a[1].c a[m].c
		long long nowans=qpow(v,n*2-2);
		if(m==1)
		{
			printf("%lld\n",nowans);
			continue;
		}
		nowans=qpow(v,a[1].c*2-2);
		for(int i=1;i<m;i++)
		{
			if(a[i+1].c==a[i].c)continue;
			long long len=a[i+1].c-a[i].c;
			long long allf=qpow(v,len*2);
			long long factf=((allf+mod-qpow(v,len))%mod+qpow(v,len-1))%mod;
			nowans=(nowans*factf)%mod;
//			cout<<factf<<" ";
		}
		printf("%lld\n",nowans*qpow(v,(n-a[m].c)*2)%mod);
	}
	return 0;
}
/*
1
10 5 2
10 2
7 2
2 2
3 2
4 2

*/
