#include<iostream>
#include<algorithm>
using namespace std;

const long long mod = 1e9 + 7;
long long T, n, m, v;
long long ans = 1;
struct node{
	long long c, d;
};

node op[200010];

long long ksm(long long a, long long b)
{
	a %= mod;
	if(b < 0) return 0;
	long long res = 1;
	while(b)
	{
		if(b & 1) res = res * a % mod;
		a = a * a % mod;
		b >>= 1;
	}
	return res;
}

bool cmp(node a, node b)
{
	return a.c == b.c ? a.d < b.d : a.c < b.c;
}

int main()
{
	freopen("assign.in", "r", stdin);
	freopen("assign.out", "w", stdout);
	scanf("%lld", &T);
	while(T--)
	{
		ans = 1;
		scanf("%lld%lld%lld", &n, &m, &v);
		
		for(long long i = 1; i <= m; i++) scanf("%lld%lld", &op[i].c, &op[i].d);
		
		sort(op + 1, op + m + 1, cmp);
		
		
//		for(long long i = 1; i <= m; i++)
//		{
//			printf("(%d %d\n", op[i].c, op[i].d);
//		}
		
		for(long long i = 1; i < m; i++)
		{
//			printf("%d\n", i);
			if(op[i].c == op[i + 1].c)
			{
				if(op[i].d != op[i + 1].d)
				{
					ans = 0;
					break;
				}
			}
			else
			{
				long long len = op[i + 1].c - op[i].c;
				ans = (ksm(v, 2 * len) - ksm(v, len - 1) * (v - 1) % mod) % mod * ans % mod;
			}
		}
		ans = ans * ksm(v, 2 * (op[1].c - 1)) % mod * ksm(v, 2 * (n - op[m].c)) % mod;
		printf("%lld\n", (ans % mod + mod) % mod);
	}
	return 0;
}
