#include<bits/stdc++.h>
using namespace std;
const long long mod = 1e9 + 7;
const long long N = 1e7 + 5;
long long a[N]; //记忆化数组 
long long n , m , v , ans = 1;
long long b[N]; //记录实点 
map<long long , long long> mapp; //去重 

long long fpow(long long x , long long y)
{
	long long t = 1;
	for(int i = 1 ; i <= y ; i++)
	{
		t = t * x;
		t%=mod;
	}
	return t;
}

long long f(long long x)
{
	if(a[x])
	{
		return a[x]%mod;
	}
	
	if(x <= 1e7)
	{
		if(x >= 1)
		{
			a[x] = 2 * fpow(v , 2 * x) % mod + 2 * f(x - 1) % mod;
		}
		else if(x <= 0)
		{
			a[x] = (v - 1) * v + 1;
			a[x]%=mod;
		}
		
		return a[x]%mod;
	}
	else	//超出数组范围就只能硬算了，希望别卡 
	{
		return  2 * fpow(v , 2 * x) % mod + 2 * f(x - 1) % mod;
	}
}

int main()
{
	freopen("assign.in" , "r" , stdin);
	freopen("assign.out" , "w" , stdout);
	
	long long t;
	scanf("%lld" , &t);
	
	while(t--)
	{
		memset(a, 0 , sizeof(a));
		//memset(b, 0 , sizeof(b));
		scanf("%lld%lld%lld" , &n , &m , &v);
		
		bool error = false; //坏了
		int cnt = 0; //有多少个真的实点 
		
		for(int i = 1 ; i <= m ; i++)
		{
			long long x , y; 
			scanf("%lld%lld" , &x , &y);
			
			if(mapp[x] == y)	//有重复，但合法 
			{
				//无事发生 
			}
			else if(mapp[x] != 0 && mapp[x] != y) //非法操作
			{
				error = true;
				break; 
			}
			else
			{
				mapp[x] = y;
				cnt++;
				b[cnt] = x; 
			}
		}
		
		if(error == true) //坏了 
		{
			cout << "0" << endl;
			mapp.clear();
			continue;
		}
		
		ans = 1;
		
		if(cnt == 0) //特判无实点 
		{
			ans = fpow(v , 2*(n-1))%mod;
			cout << ans << endl;
			
			mapp.clear();
			continue;
		}
		
		
		sort(b + 1 , b + cnt + 1);
		
		
		
		for(int i = 1 ; i <= cnt ; i++)
		{
			ans%=mod;
			if(i == 1) //特判开头 
			{
				ans *= fpow(v , 2*(b[i] - 1))%mod;
			}
			
			if(i > 1)
			{
				ans*= f(b[i] - b[i - 1] - 1)%mod;
			}
			
			if(i == cnt)
			{
				ans *= fpow(v , 2*(n - b[i]))%mod;
			}
			ans%=mod;
			
		}
		
		cout << ans%mod << endl;
		
		mapp.clear();
	}
}
//若两个数都不确定，方案 v*v
//若第一个数确定，第二个数不确定，方案数v*v ,但是有v个方案会使下个数进入确定状态
//若第一个数不确定，第二个数确定 方案数v*v
//若两个数都确定 方案数 (v-1)*v + 1 

//2 2 2 2 的方案数为27 
//x x x x 的方案数为64 
//2 x x 2 的方案数为60，分析
//实际上分成了
//x x 2
//x x 2
//1 x 2
//2 x 2

//分析1 x 2的方案数
//分成了
//x 2
//x 2
//1 2
//2 2
//2*v*v + 2*((v-1)*v + 1)

//重新分析2 x x 2
// 2*v*v*v*v + 2*(2*v*v + 2*((v-1)*v + 1))
//带入v=2 ，得60
//11:20了

//看看2 x x x 2
//x x x 2
//x x x 2
//1 x x 2
//2 x x 2 

//易得这个和数字本身是什么没关系，和数字是否确定有关系

//对于形如2 x x ... x 2 (n个x)的数列，设计如下函数
//f(n) = 
//2*v^2^n + 2f(n-1)   n>=1
//(v-1)*v + 1         n==0


//全对！多么富有基米精神！ 但还是不如农神 
//11:26 开始敲 
//19和20不能用记忆化，有点头疼
//用区间优化，他要是用2 x x... x 2 (10^9个x）来卡人就有点刻晴了 

//会超时，难受，再看看  
//算了，就这样吧，AFO了 
