#include #define up(i,l,r) for(int i=(l);i<=(r);++i) #define down(i,l,r) for(int i=(l);i>=(r);--i) #define pi pair #define p1 first #define p2 second #define m_p make_pair #define p_b push_back typedef long long ll; using namespace std; const int maxn=1e5+10,mod=1e9+7; inline ll read(){ ll x=0;short t=1;char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')t=-1;ch=getchar();} while(ch>='0'&&ch<='9')x=x*10+ch-'0',ch=getchar(); return x*t; } int n,m,v; int qp(int a,int b){ int res=1; while(b){ if(b&1)res=res*1ll*a%mod; a=a*1ll*a%mod;b>>=1; }return res; } void slv(){ n=read(),m=read(),v=read(); vectorA,B; up(i,1,m){ int x=read(),y=read(); A.p_b(m_p(x,y)); } sort(A.begin(),A.end()); for(auto it:A)if(B.empty())B.p_b(it);else if(it!=B.back())B.p_b(it); A=B;int sz=A.size(); up(i,0,sz-2)if(A[i].p1==A[i+1].p1){printf("0\n");return;} vectorP;for(auto it:A)P.p_b(it.p1); int res=qp(v,2*(P[0]-1));sz=P.size(); up(i,1,sz-1){ int L=P[i]-P[i-1]; int val=qp(v,L-1); res=res*1ll*((val*1ll*val%mod*1ll*v%mod*1ll*v%mod-val*1ll*(v-1)%mod+mod)%mod)%mod; }res=res*1ll*qp(v,2*(n-P[sz-1]))%mod; printf("%d\n",res); }int main(){ freopen("assign.in","r",stdin); freopen("assign.out","w",stdout); int t=read();while(t--)slv(); fclose(stdin); fclose(stdout); return 0; }