#include<bits/stdc++.h>
#define int long long
#define For(i, a, b) for(register int i = (a); i <= (b); ++i)
#define Rof(i, a, b) for(register int i = (a); i >= (b); --i)
#define For_Edge(i, x) for(auto i : edge[x])
#define For_Mul(i, a, b) for(register int i = (a); i <= (b); i += (a))
#define For_Sub(T, S) for(register int T = S; T; T = (T - 1) & S)
#define pii pair<int, int>
#define eb emplace_back
#define mp make_pair
#define fi first
#define se second
#define All_Vec(a) a.begin(),a.end()
#define Size(a) ((int)a.size())
using namespace std;
inline int read() {
int x = 0;
char c = getchar();
bool f = 0;
while(!isdigit(c)) f |= (c == '-'), c = getchar();
while(isdigit(c)) x = (x * 10) + (c ^ 48), c = getchar();
return f ? -x : x;
}
const int maxn = 2e5 + 5, mod = 1e9 + 7;
int T;
int n, m, V, flag, Answer;
pair < pii, int > Point[maxn];
inline void Clear() {
flag = 0, Answer = 1;
}
inline int Ksm(int A, int B) {
int res = 1;
while(B) {
if(B & 1) res = res * A % mod;
A = A * A % mod, B >>= 1;
}
return res;
}
signed main() {
freopen("assign.in", "r", stdin);
freopen("assign.out", "w", stdout);
T = read();
while(T--) {
n = read(), m = read(), V = read(); Clear();
For(i, 1, m) Point[i].fi.fi = read(), Point[i].fi.se = read(), Point[i].se = 1;
sort(Point + 1, Point + m + 1);
int len = 1;
For(i, 2, m) {
if(Point[i].fi.fi == Point[i - 1].fi.fi) {
if(Point[i].fi.se != Point[i - 1].fi.se) { flag = 1; break; }
}
else if(Point[i].fi.fi == Point[i - 1].fi.fi + 1) Point[len].se++;
else Point[++len] = Point[i];
}
if(flag) { printf("0\n"); continue; }
m = len;
For(i, 1, m) {
if(i != m) {
int l = Point[i].fi.fi, r = Point[i].fi.fi + Point[i].se - 1, l0 = Point[i + 1].fi.fi;
Answer = Answer * Ksm(((V - 1) * V + 1) % mod, r - l) % mod * (Ksm(V * V % mod, l0 - r) - (V - 1) * Ksm(V, l0 - r - 1) % mod + mod) % mod;
}
else {
int l = Point[i].fi.fi, r = Point[i].fi.fi + Point[i].se - 1, l0 = n;
Answer = Answer * Ksm(((V - 1) * V + 1) % mod, r - l) % mod * (Ksm(V * V % mod, l0 - r)) % mod;
}
}
if(Point[1].fi.fi != 1) Answer = Answer * Ksm(V * V % mod, Point[1].fi.fi - 1) % mod;
printf("%lld\n", Answer);
}
return 0;
}