#include <cstdio>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include <set>
#define int long long
using namespace std;

const int md=1e9+7;
void read(int &x){
	x=0;
	int f=1;
	char c=getchar();
	while(!('0'<=c && c<='9')){
		if(c=='-'){
			f=-1;
		}
		c=getchar();
	}
	while('0'<=c && c<='9'){
		x=(x<<3)+(x<<1)+(c^48);
		c=getchar();
	}
	x*=f;
}
int powr(int b,int k){
	int res=1;
	for(;k;k>>=1,b=b*b%md){
		if(k&1){
			res=res*b%md;
		}
	}
	return res;
}
int t,n,m,v;
signed main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	read(t);
	while(t--){
		read(n);
		read(m);
		read(v);
		int p,q;
		set<int> st;
		map<int,int> mp;
		bool flg=0;
		for(int i=1;i<=m;i++){
			read(p);
			read(q);
			if(mp[p] && mp[p]!=q){
				flg=1;
			}
			st.insert(p);
			mp[p]=q;
		}
		if(flg){
			printf("0\n");
			continue;
		}
		int res=powr(v*v%md,(*st.begin())-1+n-(*st.rbegin()));
		for(auto it=st.begin();next(it)!=st.end();it++){
			int len=*next(it)-*it;
			res=res*(powr(v*v%md,len)+md-powr(v,len-1)*(v-1)%md)%md;
		}
		printf("%lld\n",res);
	}
	return 0;
}
