#include<bits/stdc++.h>
#define ll long long

using namespace std;
const int N=1e5+10;
const int mod=1e9+7;
int n,m,v,f[N],cur[20],ans,now[20][2],Val[20];
struct node{int pos,val;}a[N];
map<int,int> unq;
bool cmp(node a,node b){return a.pos<b.pos;}

int qpow(int a,int b) {
	int ans=1;
	while(b) {
		if(b&1) ans=1ll*ans*a%mod;
		a=1ll*a*a%mod;
		b>>=1;
	}
	return ans;
}

void dfs(int u) {
	if(u==n) {
		for(int i=1;i<=n;i++) cur[i]=0;
		for(int i=1;i<=n;i++)
			if(Val[i]) cur[i]=Val[i];
		bool flg=true;
		for(int i=1;i<=n;i++)
			if(cur[i]==now[i][0]&&cur[i+1]!=0&&cur[i+1]!=now[i][1]) {
				flg=false;
				break;
			} else if(cur[i+1]==0&&cur[i]==now[i][0]) cur[i+1]=now[i][1];
		if(flg) ans++;
		return ;
	}
	now[u][0]=1,now[u][1]=1;dfs(u+1);
	now[u][0]=1,now[u][1]=2;dfs(u+1);
	now[u][0]=2,now[u][1]=1;dfs(u+1);
	now[u][0]=2,now[u][1]=2;dfs(u+1);
	return ;
}

void solve() {
	unq.clear();ans=0;
	cin>>n>>m>>v;
	for(int i=1;i<=m;i++)
		cin>>a[i].pos>>a[i].val;
	sort(a+1,a+m+1,cmp);
	for(int i=1;i<m;i++)
		if(a[i].pos==a[i+1].pos&&a[i].val!=a[i+1].val) {
			cout<<0<<"\n";
			return;
		}
	for(int i=1;i<=m;i++) unq[a[i].pos]=a[i].val; m=0;
	for(auto it:unq) a[++m].pos=it.first,a[m].val=it.second;
	if(n<=12&&m<=12) {
		for(int i=1;i<=n;i++) Val[i]=0;
		for(int i=1;i<=m;i++) Val[a[i].pos]=a[i].val; 
		dfs(1);
		cout<<ans<<"\n";
		return ;
    }
	for(int i=0;i<=m+5;i++) f[i]=0;
	f[1]=1;
	if(a[1].pos!=1) {
		int t=a[1].pos-1;
		t=qpow(1ll*v*v%mod,t);
		f[1]=1ll*f[1]*t%mod;
	}
	if((a[2].pos-a[1].pos>1)||(m==1)) {
		int t=a[2].pos-a[1].pos;
		if(m==1) t=n-a[1].pos;
		t=qpow(1ll*v*v%mod,t);
		f[1]=1ll*f[1]*t%mod;
	}
	for(int i=2;i<=m;i++) {
		int nw=a[i].pos;
		int lst=a[i-1].pos;
		if(lst==nw-1) {
			int t=(1ll*(v-1)*v%mod+1)%mod;
			f[i]=1ll*f[i-1]*t%mod;
		}
		else {
			int t=(1ll*v*v%mod);
			t=qpow(t,nw-lst);
			f[i]=1ll*f[i-1]*t%mod;
		}
	}
	cout<<f[m]<<"\n";
	return ;
}

int main() {
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	int tc;cin>>tc;
	while(tc--)solve();
	return 0;
}
