#include<bits/stdc++.h>
#define psb push_back
#define fi first
#define se second
#define endl '\n'
#define pii pair<int,int>
#define int long long
using namespace std;
const int M=1e5+5,mod=1e9+7;
int t,n,m,v;
pii a[M],tmp[M];
int qpow(int a,int b){
	int res=1;
	for(;b;b>>=1,a=a*a%mod)if(b&1)res=res*a%mod;
	return res;
}
bool check(){
	sort(a+1,a+1+m);
	int tot=0;
	for(int i=1;i<=m;i++){
		if(i<m&&a[i].fi==a[i+1].fi){
			if(a[i].se!=a[i+1].se)return 0;
		}else tmp[++tot]=a[i];
	}
	for(int i=1;i<=tot;i++)a[i]=tmp[i];
	swap(m,tot);
	return 1;
}
namespace subA{
	bool chk(){
		return n==m;
	}
	void solve(){
		int ans=1;
		for(int i=1;i<m;i++){
			ans=((v-1)*v+1)%mod*ans%mod;
		}
		cout<<ans<<endl;
	}
}
namespace subm1{
	bool chk(){return m==1;}
	void solve(){
		cout<<qpow(v,(n-1)<<1)<<endl;
	}
}
namespace baoli{
	pii lim[M];
	int ans,val[M];
	bool chk(){
		for(int i=1;i<n;i++){
			
		}
	}
	void dfs(int k){
		if(k>=n){
			if(chk())ans++;
			return;
		}
		for(int i=1;i<=v;i++){
			for(int j=1;j<=v;j++){
				lim[k]={i,j};
				dfs(k+1);
			}
		}
	}
	void solve(){
		for(int i=1;i<=m;i++)val[a[i].fi]=a[i].se;
		dfs(1);
	}
}
int solve(){
	
	int ans=qpow(v,(n-1)<<1);
//	for(int i=1;i<m;i++){
//		ans=(ans-qpow(v,a[i+1].fi-a[i].fi-1)*(v-1)%mod+mod)%mod;
//	}
	return ans;
}
signed main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);
	cin>>t;
	while(t--){
		cin>>n>>m>>v;
		for(int i=1;i<=m;i++){	
			cin>>a[i].fi>>a[i].se;
		}
		if(!check()){
			cout<<0<<endl;
			continue;
		}
		if(subA::chk()){
			subA::solve();
			continue;
		}
		if(subm1::chk()){
			subm1::solve();
			continue;
		}
		baoli::solve();
	}
	return 0;
}/*
1
3 3 2
1 1
2 1
3 2


1
10 5 2
2 2
3 2
4 2
7 2
10 2


256
0
4096
129600
4194304
503279958
748525720
892897109
174281099
418965370



3
2 1 2
1 1
2 2 2
1 1
2 2
2 2 2
1 1
1 2
*/
