// 我们发现合法的情况有两种：
// 1. 本身全乱的，不需要限制。
// 2. 有某处满足 a_i == d_j，于是拉出来了一条链，只有在这条链碰到某处不满足 c_j 限制时才直接爆了，不然若链没接上又回到第一种情况。
// 于是我们发现，直接考虑合法非常复杂，不妨考虑不合法的情况，一个位置在 i 变得不合法当且仅当从前面某处拉出来的链碰到 i 然后爆了。
// 考虑统计在 i 爆掉的情况，考虑上一个限制点 i - 1，显然它在这条链上。
// 而 i - 1 处必然合法。 
// 考虑 dp，设 f_i 为在 i 处爆掉的情况数，则显然在前 i 处均未爆掉的情况数容易计算。 
// 而后考虑上一个点。 


#include <bits/stdc++.h>
#define il inline
using namespace std;
using LL = long long;
const int N = 1e5 + 3;
const LL MOD = 1e9 + 7;
il LL qpow(LL base, LL power) {
	LL ans = 1;
	while (power) {
		if (power & 1) ans = ans * base % MOD;
		base = base * base % MOD;
		power >>= 1;
	}
	return ans;
}
LL n, m, v;
int c[N], d[N];
LL f[N];
il void solve() {
	cin >> n >> m >> v;
	map<int, int> mp;
	for (int i = 1; i <= m; i++) cin >> c[i] >> d[i];
	for (int i = 1; i <= m; i++) {
		if (mp.count(c[i])) {
			if (mp[c[i]] != d[i]) { cout << 0 << '\n'; return; }
		}
		else mp[c[i]] = d[i];
	}
	m = 0;
	for (auto it : mp) ++m, c[m] = it.first, d[m] = it.second;
	f[1] = 0;
	LL sum = 0;
	for (int i = 2; i <= m; i++) {
//		LL sum = 0; for (int j = 1; j < i; j++) (sum += f[j] * qpow(v * v % MOD, c[i - 1] - c[j]) % MOD) %= MOD;
		f[i] = (qpow(v * v % MOD, c[i - 1] - c[1]) - sum + MOD) % MOD * qpow(v, c[i] - c[i - 1] - 1) % MOD * (v - 1) % MOD;
		(sum *= qpow(v * v % MOD, c[i] - c[i - 1])) %= MOD;
		(sum += f[i]) %= MOD;
	}
	sum = 0;
	for (int i = 1; i <= m; i++) (sum += f[i] * qpow(v * v % MOD, c[m] - c[i]) % MOD) %= MOD;
	LL ans = qpow(v * v % MOD, c[1] - 1 + n - c[m]) * ((qpow(v * v % MOD, c[m] - c[1]) - sum + MOD) % MOD) % MOD;
//	for (int i = 1; i <= m; i++) cout << f[i] << ' '; cout << '\n';
	cout << ans << '\n';
}
signed main() {
	freopen("assign.in", "r", stdin);
	freopen("assign.out", "w", stdout);
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int T; cin >> T;
//	int T = 1;
	while (T--) solve();
	return 0;
}
/*
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
*/
