#include<bits/stdc++.h>
using namespace std;
const int M=1e5+5;
const long long mod=1e9+7;
int n,m;
long long v;
pair<int,int> a[M];

struct JZ
{
	int r,c;
	long long a[2][2];
	JZ operator* (const JZ &b) const
	{
		if(c!=b.r)
		{
			printf("\n\nERR1\n\n");
			exit(0);
		}
		JZ ret;
		ret.r=r,ret.c=b.c;
		for(int i=0;i<r;i++)
		{
			for(int j=0;j<b.c;j++)
			{
				ret.a[i][j]=0;
				for(int k=0;k<c;k++)
				{
					ret.a[i][j]=(ret.a[i][j]+a[i][k]*b.a[k][j])%mod;
				}
			}
		}
		return ret;
	}
};
JZ jzpw(JZ x,int k)
{
	if(x.r!=x.c)
	{
		printf("\n\nERR2\n\n");
		exit(0);
	}
	JZ ret;
	ret.r=ret.c=x.r;
	for(int i=0;i<x.r;i++)
	{
		for(int j=0;j<x.r;j++)
		{
			if(i==j)ret.a[i][j]=1;
			else ret.a[i][j]=0;
		}
	}
	while(k)
	{
		if(k&1)
		{
			ret=ret*x;
		}
		x=x*x;
		k>>=1;
	}
	return ret;
}

long long pw(long long x,int k)
{
	x%=mod;
	long long ret=1;
	while(k)
	{
		if(k&1)
		{
			ret=ret*x%mod;
		}
		x=x*x%mod;
		k>>=1;
	}
	return ret;
}

long long f(int x,long long v)
{
	JZ s={1,2,{{((v-1)*v+1)%mod,v*v%mod*v%mod},{0,0}}};
	JZ t=
	{
		2,2,
		{
			{v,0},
			{v-1,v*v%mod}
		}
	};
	return (s*jzpw(t,x-1)).a[0][0];
}

signed main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int t; scanf("%d",&t);
	while(t--)
	{
		scanf("%d %d %lld",&n,&m,&v);
		for(int i=1;i<=m;i++)
		{
			scanf("%d %d",&a[i].first,&a[i].second);
		}
		sort(a+1,a+m+1);
		long long ans=pw(v*v%mod,a[1].first-1)*pw(v*v%mod,n-a[m].first)%mod;
		for(int i=1;i<m;i++)
		{
			if(a[i].first==a[i+1].first)
			{
				if(a[i].second==a[i+1].second)
				{
					continue;
				}
				else
				{
					ans=0;
					break;
				}
			}
			ans=ans*f(a[i+1].first-a[i].first,v)%mod;
		}
		printf("%lld\n",ans);
	}
	return 0;
} 
