#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+10;
const int M=1e9+7;

//多测，清空！！！！！！！！！ 
//多测，清空！！！！！！！！！
//多测，清空！！！！！！！！！
//多测，清空！！！！！！！！！

ll T,n,m,v,len,sum;
ll v2;
vector<pair<int,int>> pos;

ll fastmi(ll di,ll k){
	ll ans=1,t=di%M;
	while(k){
		if(k&1) ans=(ans*t)%M;
		t=(t*t)%M;
		k>>=1;
	}return ans%M;
	
}

ll solve(){
	sum=1;
	//计算开头空白段的全排列。
	ll mi=(pos[0].first)-1;
	//cout<<"mi="<<mi<<'\n';
	
	sum=(sum*fastmi(v2,mi))%M;
	
	//cout<<"sump1="<<sum<<' ';
	//计算每个相邻区间的长度及值
	int bel=0; 
	//cout<<"len"<<len<<'\n';
	
	for(int i=1;i<len;i++){
		//cout<<"sbsbssbsb\n";
		//情况一：全相邻区间 
		bel=0;
		if(pos[i-1].first == pos[i].first-1){
			bel++;
			sum=(sum*(v2-(v-1)))%M;
//			if(pos[i+1].first != pos[i].first+1){
//				sum*=fastmi();
//			}
			continue; 
		}
		//情况2：中间有间隔区间
		if(pos[i-1].first != pos[i].first-1){
			int len2=pos[i].first-pos[i-1].first;
			sum=( sum* ( fastmi(v2,len2) - fastmi(v,len2-1) ) )%M;
		}
	}
	int ed=n-pos[len-1].first;
	//cout<<"ed"<<ed<<'\n';

	if(ed>0) sum=(sum*fastmi(v2,ed))%M;
	//cout<<"sump2="<<fastmi(v*v,ed)<<'\n';
	return sum%M;
}

int main(){
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	
	cin>>T;
	while(T--){
		
		pos.clear();
		cin>>n>>m>>v;
		v2=(v*v);
		
		for(int i=1,u,v;i<=m;i++){
			cin>>u>>v;
			pos.push_back({u,v});
		}
		//排序，然后判断是否有重复赋值。 
		sort(pos.begin(),pos.end());
		int flag=0;
		for(int i=1;i<m;i++){
			if(pos[i].first==pos[i-1].first && pos[i].second != pos[i-1].second){
				cout<<0<<'\n';
				flag=1;
				break;
			}
		}
		if(flag) continue;
		
		unique(pos.begin(),pos.end());
		
		//怀疑一下len的正确性。 
		len=m;
		for(int i=1;i<=m;i++){
			if(pos[i].first<=pos[i-1].first){
				len=i;
				break;
			}
		}
		
		//for(int i=0;i<m;i++){
			//cout<<pos[i].first<<' '<<pos[i].second<<'\n';	
		//}
		//cout<<len;
		cout<<solve()<<'\n';
	}
	
	
	
	 
	fclose(stdin);
	fclose(stdout);
	return 0;
} 
