#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define lowbit(x) (x&-x)
#define N 100010
int T; 
int m;
ll n,v,ans = 1;
ll imp,tot;
constexpr ll mod = 1000000007;
// 快速幂 
inline ll qpow(ll base,ll e){
	ll res = 1;
	while(e){
		if(e & 1)res = res * base % mod;
		base = base * base % mod;
		e >>= 1;
	}
	return res;
}
struct node{
	ll c,d;
}p[N];
inline bool cmp(const node &n1,const node &n2){
	return n1.c < n2.c;
}
inline void input(){
	ans = 1; 
	scanf("%lld%d%lld",&n,&m,&v);
	for(int i = 1;i <= m;++i)scanf("%lld%lld",&p[i].c,&p[i].d);
	sort(p+1,p+m+1,cmp);
}
inline void solve(){
	// 处理一下自己和前一个的关系
	ans *= qpow(v,(p[1].c-1)<<1); 
	// 总是处理自己和前一个的关系 
	for(int i = 2;i <= m;++i){
		if(p[i].c == p[i-1].c){
			if(p[i].d != p[i-1].d){
				ans = 0;// 不可能
				return;
			}
			continue;// 无论如何必须跳过，前面绝对计算过了 
		}
		// 计算不可能的方案数
		imp = qpow(v,p[i].c - p[i-1].c - 1) * (v-1) % mod;
		tot = qpow(v,(p[i].c - p[i-1].c) << 1); 
		ans *= ((tot - imp + mod) % mod);
		ans %= mod;
	}
	// 处理 ans 到 n
	if(p[m].c == n)return;// 不处理，没必要
	ans *= qpow(v,(n - p[m].c )<<1);
	ans %= mod;
//	printf("used.\n");
}
inline void output(){
	printf("%lld\n",ans);
}
int main(){ 
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%d",&T);
	while(T--){
		input();
		solve();
		output();
	}
	return 0;
}
/*
3
2 1 2
1 1
2 2 2
1 1
2 2
2 2 2
1 1
1 2
*/
