#include #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 #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) printf("%lld %lld\n", Point[i].fi.fi, Point[i].fi.fi + Point[i].se - 1); 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; //printf("!!!!%lld\n", Answer); } 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; }