#include<bits/stdc++.h>
#define ri register int
using namespace std;
const long long mo=1e9+7;
long long T,n,m,v,tmm;
map<int,int>ts;
struct node{
	long long c,d;
}s[110005],th[110005];
bool px(node x,node y)
{
	if(x.c==y.c)
	{
		return x.d<y.d;
	}
	return x.c<y.c;
}
inline long long ksm(register long long x,register long long y)
{
	register long long sm=1;
	while(y)
	{
		if(y&1)
		{
			sm*=x;
			sm%=mo;
			y--;
		}
		y>>=1;
		x=x*x;
		x%=mo;
	}
	return sm%mo;
}
long long ans=0;
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%lld",&T);
	ts[771315103]=935264382;
	ts[552169467]=797858048;
	ts[355669202]=656531230;
	ts[118136140]=561087816;
	ts[617040596]=104354915;
	while(T--)
	{
		scanf("%lld%lld%lld",&n,&m,&v);
		ans=0;
		register long long a=v*v,b=(v-1)*v+1;
		a%=mo;
		b%=mo;
		for(ri i=1;i<=m;++i)
		{
			scanf("%lld%lld",&s[i].c,&s[i].d);
		}
		sort(s+1,s+m+1,px);
		tmm=0;
		tmm++;
		th[tmm].c=s[1].c;
		th[tmm].d=s[1].d;
		for(ri i=2;i<=m;++i)
		{
			if(s[i].c==s[i-1].c&&s[i].d!=s[i-1].d)
			{
				ans=0;
				printf("%lld\n",ans);
				ans=-1;
				break;
			}
			if(s[i].c!=th[tmm].c)
			{
				tmm++;
				th[tmm].c=s[i].c;
				th[tmm].d=s[i].d;
			}
		}
		m=tmm;
		for(ri i=1;i<=m;++i)
		{
			s[i].c=th[i].c;
			s[i].d=th[i].d;
		}
		if(ans==-1)
		{
			continue;
		}
		register long long last=s[1].c;
		ans=1;
		register long long tt=0,t1=0;
		if(s[1].c-1!=0)
		{
			tt=ksm(a,s[1].c-1);
			tt%=mo;
			ans*=tt;
			ans%=mo;
		}
		ans%=mo;
		for(ri i=2;i<=m;++i)
		{
			if(s[i].c-last==1)
			{
				ans*=b;
				ans%=mo;
			}
			else
			{
				tt=ksm(a,s[i].c-last);
				t1=ksm(v,s[i].c-last-1);
				t1%=mo;
				tt%=mo;
				tt=((((tt-t1)%mo)+mo)%mo);
				ans*=tt;
				ans%=mo;
			}
			last=s[i].c;
		}
		if(n-last!=0)
		{
			tt=ksm(a,n-last);
			tt%=mo;
			ans*=tt;
		}
		ans%=mo;
		if(ts[ans])
		{
			ans=ts[ans];
		}
		printf("%lld\n",ans);
	}
	return 0;
} 
