#include<iostream>
#include<algorithm>
using namespace std;
#define N 100010
#define int long long
#define mod 1000000007
int t,n,m,v;
pair<int,int> a[N];
struct mat
{
	int a[3][3];
	mat()
	{
		a[0][0]=a[0][1]=a[0][2]=0;
		a[1][0]=a[1][1]=a[1][2]=0;
		a[2][0]=a[2][1]=a[2][2]=0;
	}
	void clear()
	{
		a[0][0]=a[0][1]=a[0][2]=0;
		a[1][0]=a[1][1]=a[1][2]=0;
		a[2][0]=a[2][1]=a[2][2]=0;
	}
	void init()
	{
		a[0][0]=a[1][1]=a[2][2]=1;
	}
	friend mat operator*(mat x,mat y)
	{
		mat res;
		for(int i=0;i<3;i++)
		for(int j=0;j<3;j++)
		for(int k=0;k<3;k++)
		 res.a[i][k]=(res.a[i][k]+x.a[i][j]*y.a[j][k])%mod;
		return res;
	}
	friend mat operator^(mat a,int k)
	{
		mat res;
		res.init();
		while(k)
		{
			if(k&1)
			 res=res*a;
			a=a*a;
			k>>=1;
		}
		return res;
	}
}zy1,zy2,now;
bool check()
{
	for(int i=2;i<=m;i++)
	if(a[i].first==a[i-1].first&&a[i].second!=a[i-1].second)
	 return 1;
	return 0;
}
signed main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);
	cout.tie(0);
	cin>>t;
	while(t--)
	{
		cin>>n>>m>>v;
		zy1.clear();
		zy1.a[0][0]=v;
		zy1.a[0][1]=v*(v-1)%mod;
		zy1.a[1][1]=v*v%mod;
		zy1.a[2][0]=v;
		zy1.a[2][1]=v*(v-1)%mod;
		zy2.clear();
		zy2.a[0][2]=(v*v-(v-1))%mod;
		zy2.a[1][2]=v*v%mod;
		zy2.a[2][2]=(v*v-(v-1))%mod;
		for(int i=1;i<=m;i++)
		 cin>>a[i].first>>a[i].second;
		sort(a+1,a+m+1);
		if(check())
		{
			cout<<0<<"\n";
			continue;
		}
		if(n==1)
		{
			cout<<1<<"\n";
			continue;
		}
		m=unique(a+1,a+m+1)-a-1;
		now.clear();
		if(a[1].first==1)
		{
			now.a[0][2]=1;
		}
		else
		{
			now.a[0][1]=1;
		}
		a[0].first=1;
		for(int i=1;i<=m;i++)
		{
			if(a[i].first==1)
			 continue;
			if(a[i].first-a[i-1].first-1>0)
			{
				now=now*(zy1^(a[i].first-a[i-1].first-1));
			}
			now=now*zy2;
		}
		if(a[m].first<n)
		{
			now=now*(zy1^(n-a[m].first));
		}
		cout<<(now.a[0][0]+now.a[0][1]+now.a[0][2])%mod<<"\n";
	}
}
