#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+76;
int c[N];
long long d[N];
const ll mo=1e9+7;
int n,m,v;
namespace sub1 {
	ll pows(ll x,ll y)
	{
		ll ans=1;
		while(y)
		{
			if(y&1) ans=(ans*x)%mo;
			x=(x*x)%mo;
			y>>=1; 
		}
		return ans;
	}
	void mainn()
	{
		printf("%lld\n",pows(v,2*(n-1))%mo);
	}
}
namespace sub2{
	int ans=0;
	int xu[23],a[15],b[15];
	int bj[30];
	void dfs(int x)
	{
		if(x==n)
		{
			for(int i=1;i<=n;i++) xu[i]=-1;
			for(int i=1;i<=m;i++) xu[c[i]]=d[i];
			for(int i=1;i<n;i++)
			{
				if(xu[i]==a[i])
				{
					if(xu[i+1]==-1) xu[i+1]=b[i];
					else if(xu[i+1]!=b[i]) return ;
				}
			}
			ans++;
		}
		else
		{
			for(int i=1;i<=2;i++)
			{
				for(int j=1;j<=2;j++)
				{
					a[x]=i,b[x]=j;
					dfs(x+1);
				}
			}
		}
	}
	void clr()
	{
		for(int i=1;i<=n;i++) bj[i]=0;
	}
	void mainn()
	{
		clr();
		for(int i=1;i<=m;i++)
		{
			if(bj[c[i]]&&bj[c[i]]!=d[i])
			{
			//	cout<<c[i]<<" "<<bj[c[i]]<<"\n";
			//	cout<<"n="<<n<<"\n";
			printf("0\n");
				return ;
			}
			bj[c[i]]=d[i];

		}
		ans=0;
		dfs(1);
		printf("%d\n",ans);
	}
}
namespace sub3{
	ll pows(ll x,ll y)
	{
		ll ans=1;
		while(y)
		{
			if(y&1) ans=(ans*x)%mo;
			x=(x*x)%mo;
			y>>=1; 
		}
		return ans;
	}
	void mainn()
	{
		printf("%lld\n",pows(1+v*(v-1),n-1));
	}
}
int main() {
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int T;
	scanf("%d",&T);
	while(T--) {
		cin>>n>>m>>v;
		for(int i=1;i<=m;i++)
		{
			scanf("%d%lld",&c[i],&d[i]);
		}
		if(m==1) sub1::mainn();
		else if(n<=12)
		{
			sub2::mainn(); 
		}
		else if(n==m)
		{
			sub3::mainn();
		}
	}
}
