#include<bits/stdc++.h>
using namespace std;
struct node{
	int c,d;
};
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	int T;
	long long f=1000000007;
	cin>>T;
	while(T--){
		int n,m,v;
		cin>>n>>m>>v;
		node str[100005];
		bool flag=true;
		int arr[1000000005]={0};
		for(int i=0;i<m;i++){
			int a,b;
			cin>>str[i].c>>str[i].d;
			if(arr[str[i].c]==0) arr[str[i].c]=str[i].d;
			else if(arr[str[i].c]!=str[i].d) flag=false;
		}
		int ans=1;
		if(!flag){
			cout<<0<<endl;
		}
		else{
			if(arr[1]!=0){
				if(arr[2]==0){
					ans*=((v%f)*(v%f))%f;
				}
				else{
						ans*=(((v%f)*((v-1)%f))+1)%f;
				}
			}
			else{
				ans*=((v%f)*(v%f))%f;
			}
			for(int i=3;i<=n;i++){
				if(arr[i]!=0){
					if(arr[i-1]!=0){
						ans*=(((v%f)*((v-1)%f))+1)%f;
					}
					else{
						ans*=((v%f)*(v%f))%f;
					}
				}
				else{
					ans*=((v%f)*(v%f))%f;
				}
			}
		}
		cout<<ans<<endl;
	}
	return 0;
} 
