#include<bits/stdc++.h>
#define int long long
using namespace std;

//struct lmt{
//	int c;
//	int d;
//	
//	operator>(lmt o){
//		return c>o.c;
//	}
//};

const int mod = 1e9+7;
const int maxm = 1e5+10;



int n, m, v;
int cur_lmt=0;
vector<pair<int, int>> ms;
unordered_map<int, int> ck;
set<pair<int, int>> se;

int pow_mod(int a, int b){
	int res = 1;
	while(b){
		if(b&1){
			res = res*a%mod;
		}
		b>>=1;
		a = a*a%mod;
	}
	return res;
}
//int result;
//int dfs(int index, int result, int cur){
//	if(index > n) return 1;
//	int tmp_res = result;
//	result=0;
//	if(ck[index] == 0){
//		//unlimit should not appear unless the first
//		cout<<"::";
//		result = pow_mod(v,2) * dfs(index+1, result, cur);
//	}	
//	else
//	{if(cur >= ms.size()) return 1;
//		int dj, nxt;
//		if(cur< ms.size()-1){
////			int dj = ms[cur].second;
//			nxt = ms[cur+1].first;
////			int tmp = pow_mod(v*v%mod, nxt-index-1);
//			for(int i=0;i<(nxt-index);i++){
//				if(i!=(nxt-index-1)) result = result + (pow_mod(v, i)*( pow_mod(pow_mod(v,2), (nxt-index-1-i) ) * (v-1) %mod * v % mod) %mod)%mod;
//				else if(i!=n-1){
//					result = result + pow_mod(v, i)* (1+v*(v-1)%mod) % mod;
//				}
//				cout<<"inn;\n";
//			}
//		}else{
//			nxt = n;
//			for(int i=0;i<(nxt-index);i++){
//				if(i!=(nxt-index-1)) result = result + (pow_mod(v, i)*( pow_mod(pow_mod(v,2), (nxt-index-1-i) ) * (v-1) %mod * v % mod) %mod)%mod;
//				else if(i!=n-1){
//					result = result + pow_mod(v, i)* (1+v*(v-1)%mod) % mod;
//				}
//				cout<<"inn;\n";
//			}
//		}
//		
//		
////		tmp += v*(1+(v-1))
//		
//		
//		result = result*dfs(nxt, result, cur+1)% mod;
//	}
//	return result;
//}


signed main(){
	freopen("assign.in", "r", stdin);
	freopen("assign.out", "w", stdout);
	
	ios::sync_with_stdio(0);
	cin.tie(0);
	
//	while(1){
//		int a, b;
//		cin>>a>>b;
//		cout<<pow_mod(a, b)<<endl;
//	}
	
	int T;
	cin>>T;
	while(T--){
		se.clear();
		ck.clear();
//		ms.clear();
		priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int,int>> > ms;
		long long result=1;
		bool stopf = false;
		
		cur_lmt=0;
		cin>>n>>m>>v;
		for(int i=0;i<m;i++){
			int cj, dj;
			cin>>cj>>dj;
//			ms.push({cj, dj});
			if(ck[cj] != 0){
				if(ck[cj] != dj){
					stopf = true;
					result=0;
					break;
				}
			}
			ck[cj] = dj;
			se.insert({cj, dj});
		}
		
		if(!stopf){
			for(auto par: se){
//				ms.push_back(par);
				ms.push(par);
			}
//			sort(ms.begin(), ms.end());
//			result = dfs(1,1, 0);
		}
		
		for(int i=1;i<n&& (!stopf);i++){
			while(ms.size() && i > (ms.top()).first) ms.pop();
			
			if(ms.top().first != i){
				result = result*v%mod*v%mod;
			}
			else{
//				cout<<"!"<<i;
				int di = ms.top().second;
				ms.pop();
				while(ms.size() && ms.top().first == i){
				
					if(ms.top().first == i && ms.top().second != di){
//						cout<<"STOP:";
						result = 0;
						stopf = true;
						break;
					}
					ms.pop();
				}
				
				
				
//				result = result*v%mod*(v-1)%mod;
				if(ms.top().first == i+1){ //x_i+1 limited
					result = (1+v*(v-1)%mod)*result%mod;
				}else{
					result = result*v%mod*v%mod;
					 
				}
			}
		}
		cout<<result<<endl;
	}
	
	return 0;
}
