#include #define N 100005 #define mod 1000000007 #define ll long long #define ull unsigned long long #define file(s) freopen(#s".in", "r", stdin), freopen(#s".out", "w", stdout) using namespace std; template inline void read(T &x) { x = 0; short flag = 1, ch = getchar(); for (; ch < '0' || ch > '9'; ch = getchar()) flag = ch ^ '-' ? 1 : -1; for (; ch >= '0' && ch <= '9'; ch = getchar()) x = (x << 3) + (x << 1) + (ch ^ 48); x *= flag; } template inline void read(T &x, More&... more) {read(x); read(more...);} inline void print(char ch) {putchar(ch);} template inline void print(T x) { if (x < 0) putchar('-'), x = ~(x - 1); if (x > 9) print(x / 10); putchar(x % 10 | 48); } template inline void print(T x, More... more) {print(x); print(more...);} struct node {int p, k; inline bool operator < (const node &o) const {return p < o.p;}} a[N]; int T, n, m, v; inline int q_pow(int x, int k) {int res = 1; while (k) {if (k & 1) res = 1ll * res * x % mod; x = 1ll * x * x % mod, k >>= 1;} return res;} inline int sub(int x, int y) {return (x -= y) < 0 ? x + mod : x;} inline void solve() { read(n, m, v); for (int i = 1; i <= m; ++ i) read(a[i].p, a[i].k); sort(a + 1, a + m + 1); for (int i = 2; i <= m; ++ i) if (a[i].p == a[i - 1].p && a[i].k ^ a[i - 1].k) return print(0, '\n'); int ans = q_pow(1ll * v * v % mod, a[1].p - 1); for (int i = 1; i < m; ++ i) if (a[i].p ^ a[i + 1].p) ans = 1ll * ans * sub(q_pow(1ll * v * v % mod, a[i + 1].p - a[i].p), 1ll * q_pow(v, a[i + 1].p - a[i].p - 1) * (v - 1) % mod) % mod; if (a[m].p ^ n) ans = 1ll * ans * q_pow(1ll * v * v % mod, n - a[m].p) % mod; print(ans, '\n'); } int main() { file(assign); for (read(T); T --;) solve(); return 0; }