#include <bits/stdc++.h>
#define int long long
using namespace std;
const int mod = 1e9+7;
const int maxn = 1e5+10;
int n,m,v;
struct node{
	int id,v;
}a[maxn],c[maxn];
int cnt= 0;
int cmp(node a,node b){
	return a.id<b.id;
}
int mpow(int a,int x){
	int res = 1;
	for(;x;x>>=1){
		if(x&1)(res*=a)%=mod;
		(a*=a)%=mod;
	}
	return res%mod;
}
void clear(){
	for(int i = 1;i<=m+4;i++){
		c[i].id = c[i].v = 0;
		a[i].id = a[i].v = 0;
	}cnt = 0;
}
void solve(){
	cin>>n>>m>>v;clear();
	for(int i = 1;i<=m;i++){
		cin>>a[i].id>>a[i].v;	
	}
	sort(a+1,a+m+1,cmp);
	c[++cnt]=a[1];
	for(int i = 2;i<=m;i++){
		if(a[i].id==a[i-1].id){
			if(a[i].v!=a[i-1].v){
				cout<<0<<'\n';
				return;
			}else continue;
		}
		c[++cnt]=a[i];
	}m = cnt;
	if(m==1){
		cout<<mpow(v,(n-1)*2)%mod<<'\n';return;
	}
//	for(int i = 1;i<=m;i++){
//		cout<<c[i].id<<'\n';
//	}

	if(m==n){
		int ans = mpow(v,(n-1)*2)%mod;
		ans=(ans-mpow(v,(n-2)*2)%mod+mod)%mod;
		cout<<ans<<'\n';
		return ;
	}


	int ans = mpow(v,(c[1].id-1)*2);
	
	for(int i = 1;i<m;i++){
		if(c[i].id==c[i+1].id-1){
			ans=ans*(v*(v-1)%mod+1)%mod;
			continue;
		}
		ans=ans*mpow(v,(c[i+1].id-c[i].id)*2)%mod;
	}
	
	cout<<ans<<'\n';
	
	
	
//	int ans = mpow(v,(n-1)*2)%mod;
//	cout<<ans-129600<<endl;
//	for(int i = 2;i<=m;i++){
//		if(c[i].id = c[i-1].id+1){
//			ans = (ans-v+1+mod)%mod;
//		}
//	}
//	cout<<ans<<'\n';
	
}
signed main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
	int T;cin>>T;
	while(T--){
		solve();
	}
}
/*
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










5
5 1 2
1 2
6 5 2
4 2
5 1
4 2
2 2
2 1
7 1 2
4 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
12 2 2
7 2
7 2

*/









