#include<bits/stdc++.h>
#define N 100001
#define mod 1000000007
using namespace std;
long long t;
long long n,m,v;
struct node{
    long long a,b;
};
bool operator==(node x,node y){
    return x.a==y.a&&x.b==y.b;
}
node p[N];
bool cmp(node x,node y){
    return x.a<y.a;
}
inline long long fpow(long long x,long long y){
    if(y==0)return 1;
    if(y%2==0){
        long long res=fpow(x,y/2);
        return res*res%mod;
    }else{
        return fpow(x,y-1)*x%mod;
    }
}
long long res;
inline void mul(long long x){
    res*=(x%mod+mod)%mod;
    res%=mod;
}
int main(){
    freopen("assign.in","r",stdin);
    freopen("assign.out","w",stdout);
    scanf("%lld",&t);
    while(t--){
        scanf("%lld%lld%lld",&n,&m,&v);
        for(long long i=1;i<=m;i++){
            scanf("%lld%lld",&p[i].a,&p[i].b);
        }
        sort(p+1,p+m+1,cmp);
        res=1;
        for(long long i=2;i<=m;i++){
            if(p[i-1].a==p[i].a&&p[i-1].b!=p[i].b){
                res=0;
                break;
            }
        }
        if(res==0){
            printf("0\n");
            continue;
        }
        m=unique(p+1,p+m+1)-p-1;
        mul(fpow(v*v%mod,p[1].a-1));
        for(long long i=2;i<=m;i++){
            long long tmp=p[i].a-p[i-1].a;
            mul(fpow(v*v%mod,tmp)-fpow(v,tmp-1)*(v-1)%mod);
        }
        mul(fpow(v*v%mod,n-p[m].a));
        printf("%lld\n",res);
    }
}
