#include<bits/stdc++.h>
using namespace std;
using i64=long long;
constexpr i64 mxm{100005},mxn{1000005},p{1'000'000'007};
int T,n,m,v;
i64 qpow(i64 a,i64 b)
{
    i64 res=1;
    for(;b;b>>=1,a=a*a%p)
        if(b&1)
            res=res*a%p;
    return res;
}
template<bool back>
i64 calc(int i)
{
    if(i==0)
    {
        if(back)
        	return (1+i64(v-1)*v)%p;
		else
			return 1;
    }
    else
    {
        i64 res=calc<back>(i-1),ans=0;
        if(back)
        	ans+=qpow(v,2*i)*i64(v-1)%p*v%p;
        else
        	ans+=qpow(v,2*i-2)*i64(v-1)%p*v%p;
        ans%=p;
        ans+=v*res%p;
        ans%=p;
        return ans;
    }
}
template<int n,int m>
struct mat{
    array<int,m>dat[n];
    template<int o>
    friend mat<n,o> operator*(mat<n,m> const&a,mat<m,o>const &b)
    {
        mat<n,o> res;
        for(int i=0;i<n;++i)
        {
            for(int j=0;j<o;++j)
            {
                res.dat[i][j]=0;
                for(int k=0;k<m;++k)
                    res.dat[i][j]=(res.dat[i][j]+i64(a.dat[i][k])*b.dat[k][j]%p)%p;
                
            }
        }
        return res;
    }
};
template<int n>
mat<n,n> operator^(mat<n,n>a,i64 b)
{
    mat<n,n>res;
    for(int i=0;i<n;++i)
    {
        for(int j=0;j<n;++j)
            res.dat[i][j]=0;
        res.dat[i][i]=1;
    }
    for(;b;b>>=1,a=a*a)
        if(b&1)
            res=res*a;
    return res;
}
mat<2,2>tf[35],tfb[35];//here,may need to alter
mat<1,2>bf,bfb;
template<bool b>
i64 calc2(i64 i)
{
	if(b)
	{
		return (bfb*(tfb[0]^i)).dat[0][0];
//		return fb[i];
	}
	else
	{
		return (bf*(tf[0]^i)).dat[0][0];
	}
//		return f[i];
}
void ini()
{
	tf[0].dat[0][0]=v%p;
	tf[0].dat[0][1]=0;
	tf[0].dat[1][0]=v%p;
	tf[0].dat[1][1]=v*i64(v)%p;
	for(int i=1;i<35;++i) 
		tf[i]=tf[i-1]*tf[i-1];
	bf.dat[0][0]=1;
	bf.dat[0][1]=v-1;
	
	tfb[0].dat[0][0]=v%p;
	tfb[0].dat[0][1]=0;
	tfb[0].dat[1][0]=v*i64(v)%p*v%p;//cube v
	tfb[0].dat[1][1]=v*i64(v)%p;
	bfb.dat[0][0]=v*i64(v-1)%p+1;
	bfb.dat[0][1]=v-1;

//	f[0]=1;
//	fb[0]=(1+i64(v-1)*v)%p;
//	for(int i=1;i<mxn;++i)
//    {
//        f[i]=0;
//        f[i]+=qpow(v,2*i-1)*i64(v-1)%p;
//        f[i]+=v*f[i-1]%p;
//        f[i]%=p;
//    }
//    for(int i=1;i<mxn;++i)
//    {
//        fb[i]=0;
//        fb[i]+=qpow(v,2*i+1)*i64(v-1)%p;
//        fb[i]+=v*fb[i-1]%p;
//        fb[i]%=p;
//	}
}
map<int,int>cd;
int main()
{
	freopen("assign.in","r",stdin);
	freopen("assign.out","w",stdout); 
    cin.tie(nullptr);
    ios::sync_with_stdio(false);
	cin>>T;
	while(T--)
	{
		cin>>n>>m>>v;
//		if(n>mxn)//remember to delete this
//		{
//			cout<<"\n";
//			continue;
//		}
		cd.clear();
		i64 ans=1;
		for(int i=0,c,d;i<m;++i)
		{
			cin>>c>>d;--c;
			if(cd.count(c))
			{
				if(d!=cd[c])
				{
					cout<<"0\n";
					goto brct;
				}
			}
			else
				cd[c]=d;
		}
		ini();
		ans=qpow(v,cd.begin()->first*2);
//		cerr<<"ans1 "<<ans<<'\n';
		for(auto it=cd.begin(),jt=next(it);jt!=cd.end();++it,++jt)
		{
//			ans=ans*calc<true>(jt->first-it->first-1)%p;
			ans=ans*calc2<true>(jt->first-it->first-1)%p;
		}
//		cerr<<"ans2 "<<ans<<'\n';
//		cerr<<"calc "<<n-1-prev(cd.end())->first<<'\n';
		ans=ans*calc2<false>(n-1-prev(cd.end())->first)%p;
		cout<<ans<<'\n';
	brct:;
	}
}
// 1
// 2 1 2
// 1 1

//passed former 7
