//当xi被赋了2个不同的值时,没有合法答案 
//否则,考虑用所有a,b的方案数减去不合法的方案数来计算答案
//一种(a,b)的方案不合法,当且仅当对于两个相邻的赋了值的xi,xj(x_i+1~x_j-1没有一元限制)
//对所有的i<=k<j,ak=b_k-1,b_j-1!=x_j(b_i-1指xi) 
//对所有相邻的xi,xj都计算如上的总限制方案数-不合法限制的数量,最后乘起来即可 

#include<iostream>
#include<algorithm>
#define int long long 
using namespace std;

struct node{
	int k,w;
};

const int mod=1e9+7;
const int MAXN=1e5+5;
int t,n,m,v,ans;
node a[MAXN];

bool cmp(node x,node y){
	return x.k<y.k;
}

int qpow(int a,int p){
//	if(a==0) return 1;
	int ans=1,base=a;
	while(p){
		if(p&1){
			ans*=base;
			ans%=mod;
		}
		base*=base;
		base%=mod;
		p>>=1;
	}
	return ans;
} 

signed main(){
//	froepen("1.txt","r",stdin); 
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	std::ios::sync_with_stdio(false);
	cin.tie(0);
	cin>>t;
	while(t--){
		ans=1;
		cin>>n>>m>>v;
		for(int i=1;i<=m;i++) cin>>a[i].k>>a[i].w;
		sort(a+1,a+m+1,cmp);
		for(int i=1;i<m;i++){
			if(a[i].k==a[i+1].k){
				if(a[i].w!=a[i+1].w){
					ans=0;
					break;
				}else continue;
			}
			ans*=qpow(v,(a[i+1].k-a[i].k)*2)-qpow(v,a[i+1].k-a[i].k-1)*(v-1)%mod+mod;
			ans%=mod;
		}
		cout<<ans*qpow(v,(a[1].k+n-a[m].k-1)*2)%mod<<'\n';
	}
	return 0;
}

/*

10:24 过样例1及样例2前9组数据 
10:40 全部样例通过 

*/
