#include<bits/stdc++.h>
using namespace std;
const int maxn=100010,q=1000000007;
long long quick[maxn];
long long j,n,m,cnt,v,ans,c,d,k,t;
struct node{
	int c,d;
	bool operator <(const node &x)const{
		return c<x.c;
	}
} pot[maxn];
long long mod(long long x){
	return ((x%q)+q)%q;
}
long long f(int x){
	if(x<100010)if(quick[x]!=0)return quick[x];
	long long k=f(x/2)*f(x-x/2)%q;
	if(x<100010){
		quick[x]=k;
	}
	return k;
}
long long max(long long a,long long b){
	if(a>b)return a;
	else return b;
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	cin>>t;
	quick[0]=1;
	for(int ii=1;ii<=t;ii++){
		ans=1;
		k=cnt=0;
		scanf("%lld%lld%lld",&n,&m,&v);
		quick[1]=v;
		for(register int i=2;i<=100005;i++)quick[i]=0;
		for(register int i=1;i<=m;i++)scanf("%d%d",&pot[i].c,&pot[i].d);
		sort(pot+1,pot+1+m);
		for(int i=1;i<=m;i++){
			if(pot[i].c==pot[i+1].c){
				cnt++;
				if(pot[i].d==pot[i+1].d)pot[i].d=1000000001;
				else k=1;
			}
		}
		if(k){
			cout<<0<<endl;
			continue;
		}
		sort(pot+1,pot+1+m);
		cnt=m-cnt;
		for(register int i=2;i<=cnt;i++){
			long long all=f(pot[i].c)-ans;
			if((pot[i].c-pot[i-1].c)>1)ans=ans*max(1,(f(2*(pot[i].c-pot[i-1].c))-v));
			else ans=ans*max(1,(f(2*(pot[i].c-pot[i-1].c))-1));
		}
		ans=mod(ans*f(2*pot[1].c-2));
		ans=mod(ans*f(2*(n-pot[cnt].c)));
		cout<<ans<<endl;
	}
}
