#include<bits/stdc++.h>
#define re register
#define ll long long
using namespace std;
const int mod=1e9+7;
int c[1000005],d[1000005];
ll f[1000005],g[1000005];
struct node
{
	int pos,w;
}t[1000008],t1[1000005];
int n,m;
ll V;
ll fpow(re ll x,re ll y=mod-2)
{
	re ll sum=1,base=x;
	while(y)
	{
		if(y&1) sum=sum*base%mod;
		base=base*base%mod;
		y/=2;
	}
	return sum;
}
bool cmp(node x,node y)
{
	return x.pos<y.pos;
}
ll zdj(re ll l,re ll r)
{
	return fpow(V,r-l)*fpow(V,r-l)%mod;
}
ll read()
{
	re char c=getchar();
	re ll sum=0,opt=1;
	while(c>'9'||c<'0')
	{
		if(c=='-') opt=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		sum=sum*10+c-'0';
		c=getchar();
	}
	return sum*opt;
}
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	re int T;
	T=read();
//	scanf("%d",&T);
	for(re int ct=1;ct<=T;ct++)
	{
		scanf("%d%d%lld",&n,&m,&V);
//		re int bz0=0;
		for(re int i=1;i<=m;i++)
		{
			c[i]=read();
			d[i]=read();
//			if(c[i]!=i) bz0=1;
			t[i]=node{c[i],d[i]};
		}
//		if(ct!=5) continue;
//		if(m==1)
//		{
//			re ll ans=fpow(V,n-1)*fpow(V,n-1)%mod;
////			printf("%lld ",ct);
//			printf("%lld\n",ans);
//			continue;
//		}
//		if(m==n&&bz0==0)
//		{
//			re ll ans=1;
//			for(re int i=1;i<n;i++)
//			{
//				ans=ans*((V-1)*(V)%mod+1)%mod;
//			}
//			printf("%lld\n",ans);
//			continue;
//		}
		sort(t+1,t+m+1,cmp);
		re int cnt0=0,kz=0;
		for(re int i=1;i<=m;i++)
		{
			if(i>1&&t[i].pos==t[i-1].pos)
			{
				if(t[i].w!=t[i-1].w)
				{
					kz=1;
					break;
				}
			}
			else
			{
				t1[++cnt0]=t[i];
			}
		}
		if(kz==1)
		{
			printf("0\n");
			continue;
		}
//		ll ans=0;
//		f[1]=0;
		g[1]=fpow(V,t1[1].pos-1)*fpow(V,t1[1].pos-1)%mod;
		for(re int i=2;i<=cnt0;i++)
		{
			ll val=fpow(V,t1[i].pos-t1[i-1].pos-1)*(V-1)%mod;
//			printf("%lld\n",val);
//			f[i]=g[i-1]*val%mod;
			g[i]=g[i-1]*(zdj(t1[i-1].pos,t1[i].pos)-val+mod)%mod;
//			ans=ans+f[i];
//			ans%=mod;
		}
		if(t1[cnt0].pos!=n)
		g[cnt0]=g[cnt0]*fpow(V,n-1-t1[cnt0].pos+1)%mod*fpow(V,n-1-t1[cnt0].pos+1)%mod; 
		printf("%lld\n",g[cnt0]);
	}
	return 0;
}

