#include <bits/stdc++.h>
#define C__ const
#define int long long
using namespace std;
inline void filopen(string path) {
	cin.tie(0)->sync_with_stdio(0);
	freopen((path + ".in").c_str(), "r", stdin);
	freopen((path + ".out").c_str(), "w", stdout);
}
C__ int M_ = 1e5 + 10, Mod = 1e9 + 7;
int fpow(int a, int b) { int c = 1; for (; b; (a *= a) %= Mod, b >>= 1) if (b & 1) (c *= a) %= Mod; return c; }
int n, m, v;
pair<int, int> a[M_];
//namespace Task1 {
//	bool check() { return n <= 12 && v == 2; }
//	int b[20], d[20], ans;
//	void dfs(int i) {
//		if (i > n) {
//			int res = 1;
//			for (int i = 1; i < n; i++) {
//				int cnt = bool(b[i]) + bool(b[i + 1]);
//				(res *= (cnt + 1)) %= Mod;
//			}
//			for (int i = 1; i <= n; i++) cout << d[i] << " \n"[i == n];
//			cout << res << "\n";
//			(ans += res) %= Mod;
//			return;
//		}
//		if (b[i]) {
//			d[i] = b[i];
//			dfs(i + 1);
//		} else {
//			for (int c : {1, 2}) {
//				d[i] = c;
//				dfs(i + 1);
//			}
//		}
//	}
//	void main() {
//		ans = 0;
//		memset(b, 0, sizeof b);
//		memset(d, 0, sizeof d);
//		for (int i = 1; i <= m; i++) {
//			int x, y; tie(x, y) = a[i];
//			if (!b[x]) b[x] = y;
//			else if (b[x] != y) return cout << 0 << "\n", void();
//		}
//		dfs(1);
//		cout << ans << "\n";
//	}
//}
namespace Task2 {
	bool check() { return m == 1; }
	void main() { cout << fpow(v, (n - 1) * 2) << "\n"; }
}
namespace Task1 {
	bool check() { return n <= 1e5; }
	int b[M_];
	void main() {
		memset(b, 0, sizeof b);
		for (int i = 1; i <= m; i++) {
			int x, y; tie(x, y) = a[i];
			if (!b[x]) b[x] = y;
			else if (b[x] != y) return cout << 0 << "\n", void();
		}
		int ans = 1;
		for (int i = 1; i < n; i++) {
			int res = (b[i] && b[i + 1] ? v * (v - 1) % Mod + 1 : v * v % Mod) % Mod;
			(ans *= res) %= Mod;
		}
		cout << ans << "\n";
	}
}
void slove() {
	cin >> n >> m >> v;
	for (int i = 1; i <= m; i++)
		cin >> a[i].first >> a[i].second;
	if (v == 1) return cout << 1 << "\n", void();
	if (Task2::check()) return Task2::main();
	if (Task1::check()) return Task1::main();
}
signed main() {
//	freopen("assign1.in", "r", stdin);
	filopen("assign");
	int T; cin >> T;
	while (T--) {
		slove();
	}
	return 0;
}
