#include #include using namespace std; inline long long read() { long long num = 0, fg = 1; char c = getchar(); while(!isdigit(c)) { if (c == '-') fg = -fg; c = getchar(); } while(isdigit(c)) { num = num * 10 + c - '0'; c = getchar(); } return num * fg; } const long long mod = 1e9 + 7; long long qpow(long long, long long); int Solve(); int main() { freopen("assign.in", "r", stdin); freopen("assign.out", "w", stdout); int T = read(); for (int i = 1; i <= T; i++) Solve(); return 0; } namespace M1 { int solve(); } #define MAXM 1500006 long long n, m, v; struct Task { int pos, val; bool operator< (const Task tas) const { return this->pos < tas.pos; } }; Task a[MAXM]; namespace ACT { int solve(); } int Solve() { n = read(), m = read(), v = read(); for (int i = 1; i <= m; i++) a[i].pos = read(), a[i].val = read(); sort (a + 1, a + m + 1); if (m == 1) return M1::solve(); return ACT::solve(); return 0; } namespace ACT { int solve() { //printf("m = %d, n = %d, v = %d\n", m, n, v); for (int i = 2; i <= m; i++) if (a[i].pos == a[i - 1].pos && a[i].val != a[i - 1].val) { printf("0\n"); return 0; } long long ans = 1ll; a[0].pos = 0; for (int i = 2; i <= m; i++) { if (a[i].pos == a[i - 1].pos) continue; long long x = a[i].pos - a[i - 1].pos - 1; //printf("x = %lld\n", x); ans = ans * (qpow(v * v % mod, x + 1) % mod - (v - 1ll) * qpow(v, x) % mod) % mod; } ans = (ans % mod + mod) % mod; //printf("tmp ans = %lld\n", ans); if (a[1].pos != 1) { ans = ans * qpow(v * v % mod, a[1].pos - 1) % mod; } if (a[m].pos != n) { ans = ans * qpow(v * v % mod, n - a[m].pos) % mod; } ans = (ans % mod + mod) % mod; printf("%lld\n", ans); return 0; } } namespace M1 { int solve() { long long ans = qpow(v * v % mod, n - 1); printf("%lld\n", ans % mod); return 0; } } long long qpow(long long bas, long long po) { long long ret = 1; while(po) { if (po & 1ll) ret = ret * bas % mod; bas = bas * bas % mod; po >>= 1ll; } return ret; }