#include<bits/stdc++.h>
#define ll long long
using namespace std;
int read()
{
	int x=0,w=1;
	char c=0;
	while(c<'0'||c>'9')
	{
		if(c=='-')w=-1;
		c=getchar();
	}
	while(c>='0'&&c<='9')
	{
		x=(x<<1)+(x<<3)+c-'0';
		c=getchar();
	}
	return x*w;
}
const ll mod=1e9+7;
const int maxn=1e5+9;
ll qpow(ll a,ll b)
{
	ll res=1;
	while(b)
	{
		if(b&1)res=res*a%mod;
		a=a*a%mod;
		b>>=1;
	}
	return res;
}
int c[maxn],d[maxn];
ll ans=0;
struct node
{
	int c,d,opt;
	bool operator<(const node &you)const
	{
		return c<you.c;
	}
	bool operator==(const node &you)const
	{
		return c==you.c;
	}
}a[maxn]; 
int x[maxn];
int A[maxn],B[maxn];
ll n,m,v;
map<int,int>vis;
bool ok;
void dfs2(int k)
{
	if(n==k+1)
	{
		for(int i=1;i<n;i++)
		{
			if(x[i]==A[i]&&x[i+1]!=B[i])return;
		}
		ok=true;
		return;
	}
	for(int i=1;i<=v;i++)
	{
		x[k]=i;
		dfs2(k+1);
	}
}
void dfs1(int k)
{
	if(k==n-1)
	{
		ok=false;
		dfs2(1);
	}
	for(int i=1;i<=v;i++)
	{
		A[k]=i;
		dfs1(k+1);
	}
} 
int f[maxn][3][3];
void solve()
{
	vis.clear();
	n=read();m=read();v=read();
	bool flag=false; 
	for(int i=1;i<=m;i++)
	{
		c[i]=read();d[i]=read();
		if(vis[c[i]]&&vis[c[i]]!=d[i])flag=true;
		vis[c[i]]=d[i];
	}
	if(flag)
	{
		printf("0\n");
		return;
	}
	ans=0;
	if(m==1)
	{
		ans=qpow(v,1ll*(n-1)*2);
		printf("%lld\n",ans);
		return ;
	}
	if(n==m)
	{
		bool flag2=true;
		for(int i=1;i<=m;i++)
		{
			if(c[i]!=i)
			{
				flag2=false;
				break;
			}
		}
		if(flag2)
		{
			ans=qpow((1ll*(v-1)*v+1)%mod,n-1)%mod;
			printf("%lld\n",ans);
			return ;
		}
	}
	else
	{
//		for(int j=1;j<=v;j++)
//		{
//			for(int k=1;k<=v;k++)
//			{
//				if(vis.find(1)&&vis.find(2)&&vis[1]==j&&vis[2]!=k)
//			}
//		}
//		for(int i=2;i<=n;i++)
//		{
//			for(int j=1;j<=v;j++)
//			{
//				for(int k=1;k<=v;k++)
//				{
//					for(int lstj=1;lstj<=v;lstj++)
//					{
//						for(int lstk=1;lstk<=v;lstk++)
//						{
//							f[i][j][k]=(f[i][j][k]+
//						}
//					}
//				}
//			}
//			
//		}
//		ans=(f[n-1][0]+f[n-1][1])%mod;
//				printf("%lld\n",ans);
//			return ;
		vector<node>b;
		for(int i=1;i<=m;i++)
		{
			b.push_back({c[i],d[i],1});
		}
		sort(b.begin(),b.end());
		b.erase(unique(b.begin(),b.end()),b.end());
		if(b[0].c>2)ans=qpow(v,(b[0].c-2)*2)*(v-1)%mod*v%mod+1;
		else if(b[0].c==2)ans=(v-1)*v%mod+1;
		else ans=1;
		ans%=mod;
		int lst=b[0].c;
		for(int i=1;i<b.size()-1;i++)
		{
			int now=b[i].c;
			ll x=now-2-(lst+1)+1;
			ans=ans*(v-1)%mod*qpow(v,2*x+3)%mod;
			for(int j=1;j<=x;j++)
			{
				ans=ans*(v-1)%mod*v%mod*qpow(v,x-j)%mod*qpow(v,x-j)%mod;
			}
			ans=ans*v%mod*v%mod;
			ans=ans*v%mod;
			ans=(ans+x)%mod;
			ans=(ans+(v-1)*v%mod+1)%mod;
		}
//		ans=1;
//		int s=1;
//		if(a[1].c==1)
//		{
//			s=2;
//			if(a[1].c+1==a[2].c)ans=((v-1)*v%mod+1)%mod;
//			else ans= 
//		}
//		for(int i=s;i<=m;i++)
//		{
//			if(a[i].c+1==a[i+1].c)
//			{
//				ans=ans*	
//			} 
//		}
//		{
//			for(int j=1;j<=v;j++)
//			{
//				f[i][j]=
//			}
//		}
//		for(int i=1;i<=n;i++)
//		{
//			if(vis.find(i)==vis.end())
//			{
//				f[i][0]=f[i-1][0]*v+f[i-1][1];
//				f[i][1]=f[i-1][1];
//			}
//			else
//			{
//				f[i][0]=f[i-1][0]*v;
//				if(f[i-1][1])f[i][0]++;
//				f[i][1]=f[i-1][1];
//			}
//		}
//		ans=(f[n][0]+f[n][1]);
		
	}
	printf("%lld\n",ans);
}
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int T;T=read();
	while(T--)solve();
	return 0;
}
//10 11 2
//10 2
//7 2
//7 2
//2 2
//3 2
//4 2
//10 2
//7 2
//10 2
//3 2
//3 2
