//T2 assign designed by S_Kuroko
#include<bits/stdc++.h>
//#define int long long
using namespace std;
const int N=2e5+5;
const long long mod=1e9+7;

long long c[N],d[N];
long long qpow(long long a,long long b)
{
	long long res=1;
	while(b)
	{
		if(b&1) res=(res*a+mod)%mod;
		a=(a*a+mod)%mod;
		b>>=1; 
	}
	return (res+mod)%mod;
}
int a[N];

int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int T;
	cin>>T;
	while(T--)
	{
		long long n,m,v;
		cin>>n>>m>>v;
		bool flagA=(m==n);
		bool flagB=1;
		for(int i=1;i<=m;i++)
		{
			cin>>c[i]>>d[i];
			if(c[i]!=i) flagA=0;
			if(d[i]!=1) flagB=0;
		}
		if(flagA)
		{
			long long ans=1;
			for(int i=1;i<=n-1;i++)
			{
				long long ch=1+(v-1)*v;
				ans*=ch;
				ans%=mod;
			}
			cout<<ans<<endl;
			continue;
		}
		if(m==1)
		{
			long long ans=qpow((v*v)%mod,n-1);
			cout<<(ans+mod)%mod<<"\n";
			continue;
		}
		if(flagB)
		{
			int st=1;
			long long ans=1;
			ans=qpow((v*(v-1)),n-1);
			cout<<ans%mod<<endl;
			continue;
		}
		cout<<0<<endl;
		//long long ans=qpow((v*v)%mod,n-1);
		//cout<<(ans+mod)%mod<<"\n";
		
//		if(v==2)
//		{
//			memset(a,-1,sizeof a);
//			for(int i=1;i<=m;i++)
//			{
//				if(d[i]==2) d[i]=0;
//				a[c[i]]=d[i];
//			}
//			long long ans=1;
//			for(i=2;i<=n;i++)
//			{
//				if(a[i]!=-1)
//				{
//					
//				}
//			}
//			continue;
//		}
	}
	return 0;
}

