#include <bits/stdc++.h>
using namespace std;
const long long int Maxn=1e5+9,inf=1e9+7;
int T;
long long int powV[Maxn];
struct node{
	int c,d;
}ht[Maxn];

bool cmp(node a,node b)
{
	return a.c < b.c;
}

int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	cin>>T;
	while(T--)
	{
		long long int n,m,v; long long int myans=0;
		cin>>n>>m>>v;
		for(int i = 1;i <= m;i++) cin>>ht[i].c>>ht[i].d;
		ht[m+1].c=n; ht[m+1].d=ht[m].d;
		sort(ht+1,ht+m+1,cmp);
		
		int flag=0;
		for(int i=1;i <= m;i++)
			{
				if(ht[i].c==ht[i+1].c)
				{
					if(ht[i].d==ht[i+1].d) continue;
					else{
						flag=1;
						break;
					}
				}
		}
		if(flag){
			cout<<0<<endl;
			continue;
		}
		
//		for(int i=1;i<=m;i++) cout<<ht[i].c<<"a ";
		if(m==1)
		{
			unsigned long long int tmp=1;
			for(int i = 1;i <= 2*n-2;i++) {		
				tmp=tmp*v;
				tmp=tmp%inf;
			}
			cout<<tmp<<endl;
			continue;
		}//(v^2)^n-1
		if(v==2)
		{
			int pow2[100]; pow2[0]=1; 
			for(int i=1;i<=10;i++) pow2[i]=pow2[i-1]*2;
			int flag=0;
			for(int i=1;i <= m;i++)
			{
				if(ht[i].c==ht[i+1].c)
				{
					if(ht[i].d==ht[i+1].d) continue;
					else{
						flag=1;
						break;
					}
				}
				else{
					if(ht[i+1].c-ht[i].c==1) myans=myans+3;
					else if(ht[i+1].c-ht[i].c==2) myans=myans+1+2;
					else{
						myans=myans+pow2[(ht[i+1].c-ht[i].c)-2]+4;
					}
				}
			}
			if(flag){
				cout<<0<<endl;
				continue;
			}
			
		}	
		
		for(int i=1;i<=m;i++){ ht[i].c=0; ht[i].d=0;}
		cout<<myans<<endl; 
	}
	
	return 0;
}
