//T2
#include<bits/stdc++.h>
#define ll long long
#define db double
#define pii pair<int,int>
#define pll pair<ll,ll>
#define pil pair<int,ll>
#define pli pair<ll,int>
#define pdd pair<db,db>
#define F first
#define S second
#define pb push_back
using namespace std;
const ll mod=1e9+7; const int N=1e5+5;
struct Mat{
	int n,m; ll num[3][3];
	void init(int x,int y){
		n=x; m=y;
		for(int i=1;i<=x;++i) for(int j=1;j<=y;++j) num[i][j]=0;
	}
}tr1,tr2,st;
Mat operator * (Mat a,Mat b){
	Mat c; c.init(a.n,b.m);
	for(int i=1;i<=c.n;++i) for(int j=1;j<=c.m;++j) for(int k=1;k<=a.m;++k) (c.num[i][j]+=a.num[i][k]*b.num[k][j]%mod)%=mod;
	return c;
}
Mat mksm(Mat x,Mat a,int b){
	while(b){
		if(b&1) x=x*a;
		a=a*a;
		b>>=1;
	}
	return x;
}
int T,n,m,cnt[N],vis[N],tvis[N],df[N],ans;
pii a[N];
ll v;
void dfs(int step){
	if(step==2*n-1){
		bool flag=0;
		for(int i=1;i<=n;++i) tvis[i]=vis[i];
		for(int i=1;i<n;++i){
			if(tvis[i] && tvis[i+1]){
				if(df[i*2-1]==tvis[i] && df[i*2]!=tvis[i+1]){
					flag=1;
					break;
				}
			}
			if(tvis[i]==df[i*2-1]) tvis[i+1]=df[i*2];
		}
		if(!flag) ++ans;
		return;
	}
	df[step]=1;
	dfs(step+1);
	df[step]=2;
	dfs(step+1);
}
void solve(){
	scanf("%d%d%lld",&n,&m,&v);
	st.init(1,2); st.num[1][1]=1;
	tr1.init(2,2); tr1.num[1][1]=tr1.num[2][1]=v*(v-1)%mod; tr1.num[1][2]=tr1.num[2][2]=1;
	tr2.init(2,2); tr2.num[1][1]=tr2.num[2][1]=v*(v-1)%mod; tr2.num[1][2]=tr2.num[2][2]=v;
	for(int i=1;i<=m;++i) scanf("%d%d",&a[i].F,&a[i].S);
	sort(a+1,a+m+1);
	for(int i=1;i<m;++i) if(a[i].F==a[i+1].F && a[i].S!=a[i+1].S) return printf("0\n"),void();
	m=unique(a+1,a+m+1)-a-1;
	if(v<3 && n<=10){
		for(int i=1;i<=n;++i) vis[i]=0;
		for(int i=1;i<=m;++i) vis[a[i].F]=a[i].S;
		ans=0;
		dfs(1);
		printf("%d\n",ans);
		return;
	}
	if(a[1].F!=1){
		st=mksm(st,tr2,a[1].F-2);
		st=st*tr1;
		(st.num[1][2]*=v)%=mod;
//		printf("%lld %lld\n",st.num[1][1],st.num[1][2]);
	}
	for(int i=2;i<=m;++i){
		st=mksm(st,tr2,a[i].F-a[i-1].F-1);
		st=st*tr1;
//		printf("%lld %lld\n",st.num[1][1],st.num[1][2]);
	}
	st=mksm(st,tr2,n-a[m].F);
//	printf("%lld %lld\n",st.num[1][1],st.num[1][2]);
	printf("%lld\n",(st.num[1][1]+st.num[1][2])%mod);
}
int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	scanf("%d",&T);
	while(T--) solve();
	return 0;
}
/*
1
10 5 2
10 2
7 2
2 2
4 2
3 2

*/

