#include<cstdio>
#include<string>
#include<cstring>
#include<iostream>
#include<algorithm>

#define LL long long
#define upfor(i,a,b) for(LL i=(a);i<=(b);i++)
#define dnfor(i,a,b) for(LL i=(a);i>=(b);i--)

using namespace std;

void FileIO(string file) {
	freopen((file+".in").c_str(),"r",stdin);
	freopen((file+".out").c_str(),"w",stdout);
}

LL read() {
	LL n=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9') {
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9') {
		n=n*10+ch-'0';
		ch=getchar();
	}
	return n*f;
}

const LL MOD=1e9+7;
const LL M=1e5+5;
const LL N=1e6+5; // ！！！此为部分分数据！！！ 

LL T;
LL n,m,v;
LL diff;
LL pa;
LL ans;
struct Req {
	LL c,d;
} r[M];

LL qpow(LL a,LL b) {
	a%=MOD;
	LL ret=1;
	while(b) {
		if(b&1) (ret*=a)%=MOD;
		(a*=a)%=MOD;
		b>>=1;
	}
	return ret;
}

void solve() {
	ans=1;
	sort(r+1,r+1+m,[](Req x,Req y) {
		return x.c<y.c;
	});
	upfor(i,2,m) { // 2开始？
		if(r[i].d!=r[i-1].d&&r[i].c==r[i-1].c) {
			printf ("0\n");
			return ;
		}
		if(r[i].c==r[i-1].c) continue;
		if(r[i].c==r[i-1].c+1) {
			pa++;
			(ans*=((v-1)*v%MOD+1))%=MOD;
		}
	}
	(ans*=qpow(v*v,n-1-pa))%=MOD;
	printf ("%lld\n",ans);
}
//LL f[N];
//void solve() {
//	sort(r+1,r+1+m,[](Req x,Req y) {
//		return x.c<y.c;
//	});
//	upfor(i,2,m) { // 2开始？
//		if(r[i].d!=r[i-1].d&&r[i].c==r[i-1].c) {
//			printf ("0\n");
//			return ;
//		}
//	}
//	f[1]=1;
//	LL j=1;
//	while(r[j].c==1&&j<m) j++;
//	upfor(i,2,n) {
//		if(r[j].c==i) {
//			if(r[j-1].c==i-1) {
//				f[i]=f[i-1]*((v-1)*v%MOD+1)%MOD;
//			} else {
//				f[i]=f[i-1]*((v-1)*v%MOD+1)%MOD;
//			}
//			while(r[j].c==i&&j<=m) j++;
//		} else {
//			f[i]=f[i-1]*v*v%MOD;
//		}
//	}
//	printf ("%lld\n",f[n]);
//}

//bool flagA;
//
//LL f[N];
//void workA() {
//	printf ("%lld\n",qpow((v-1)*v+1,n-1));
//}
//void solve() {
//	sort(r+1,r+1+m,[](Req x,Req y) {
//		return x.c<y.c;
//	});
//	upfor(i,1,m) {
//		if(r[i].c!=i)  flagA=false;
//	}
//	if(flagA) {
//		workA();
//		return;
//	}
//}

// 多测要清空！！！
int main() {
	FileIO("assign");
	T=read();
	while(T--) {
//		flagA=true;
		n=read(),m=read(),v=read();
//		if(n!=m) flagA=false;
		upfor(i,1,m) {
			r[i].c=read(),r[i].d=read();
		}
		solve();
	}
	return 0;
}
