#include<bits/stdc++.h>
using namespace std;
namespace Higt{
	#define M 1005
	string cheng(string x,string y){
		int lx=x.size(),ly=y.size();
		int a[M]={0},b[M]={0};
		for(int i=1;i<=lx;i++) a[i]=x[lx-i]-'0';
		for(int i=1;i<=ly;i++) b[i]=y[ly-i]-'0';
		int lz=lx+ly;
		int c[M]={0};
		for(int i=1;i<=lx;i++){
			for(int j=1;j<=ly;j++){
				c[i+j-1]+=a[i]*b[j];
			}
		}
		for(int i=1;i<lz;i++){
			c[i+1]+=c[i]/10;
			c[i]%=10;
		}
		while(c[lz]==0)lz--;
		string z;
		for(int i=lz;i>=1;i--) z+=(c[i]+'0');
		return z;
	}
}
namespace Assign{
	#define N 100005
	#define PII pair<int,int>
	#define MOD 1000000007
	#define ll long long
	int n,m,v;
	class node{
		public:
			int p,w;
	}f[N];
	bool cmp(node x,node y){
		return x.p<y.p;
	}
	void into(){
		scanf("%d%d%d",&n,&m,&v);
		int over=1;
		for(int i=1;i<=m;i++){
			scanf("%d %d",&f[i].p,&f[i].w);	
		}
		sort(f+1,f+1+m,cmp);
//		printf("%d\n",f[1].p);
		for(int i=2;i<=n;i++) {
			if(f[i-1].p==f[i].p&&f[i-1].w!=f[i].w){
				printf("0 \n");
				return;
			}
		}
		ll k=(v*v)%MOD;
//		printf("    %lld\n",k);
		 
		ll ans=1;
		if(m==1){
			for(int i=1;i<=n-1;i++) ans=(ans*k)%MOD;
			cout<<ans<<" \n";
			return;
		}
		int kk=1,p=1;
		for(int i=1;i<=n;i++){
			while(i>f[kk].p) kk++,p=k+1;
			while(f[p-1].p==f[p].p) p++;
			if(i==f[kk].p&&i+1==f[p].p) ans=(ans*(((v-1)*v)%MOD+1))%MOD;
			else ans=(ans*v)%MOD;
		}
		cout<<ans<<" \n";
		
		return;
	}
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int _;
	scanf("%d",&_);
	for(int i=1;i<=_;i++) Assign::into();
	return 0;
}
/*
1
10 11 2
10 2
7 2
7 2
2 2
3 2
4 2
10 2
7 2
10 2
3 2
3 2
*/
