// #include<bits/stdc++.h>
// const long long N=100000;
// const long long mod=1e9+7;
// using namespace std;
// long long T,n,m,v,dp[N+5],res,hp,o,ans;
// struct node{
//     long long pos,val;
//     bool operator<(const node &o)const{
//         return pos<o.pos;
//     }
// }t[N+5];
// bool bz;
// void Init(){
//     ans=0;
// }
// long long Q(long long x,long long y){
//     res=1;
//     while(y>0){
//         if(y&1) res=res*x%mod;
//         x=x*x%mod;
//         y/=2;
//     }
//     return res;
// }
// long long A(long long x){
//     return Q(v,2*x);
// }
// int main(){
//     freopen("assign.in","r",stdin);
//     freopen("assign.out","w",stdout);
//     scanf("%lld",&T);
//     while(T--){
//         Init();
//         scanf("%lld%lld%lld",&n,&m,&v);
//         // cout<<n<<' '<<m<<' '<<v<<endl;
//         for(int i=1;i<=m;i++)
//             scanf("%lld%lld",&t[i].pos,&t[i].val);
//         sort(t+1,t+1+m);
//         bz=true;
//         for(int i=2;i<=m;i++){
//             if(t[i].pos==t[i-1].pos&&t[i].val!=t[i-1].val){
//                 bz=false;
//                 break;
//             }
//         }
//         if(bz==false){
//             printf("0\n");
//             continue;
//         }
//         dp[1]=A(t[1].pos-1);
//         for(int i=2;i<=m;i++){
//             if(t[i].pos==t[i-1].pos){
//                 dp[i]=dp[i-1];
//                 continue;
//             }
//             o=t[i].pos-t[i-1].pos;
//             hp=((A(o)-Q(v,o-1)*(v-1)%mod)%mod+mod)%mod;
//             dp[i]=dp[i-1]*hp%mod;
//         }
//         for(int i=2;i<=m;i++){
//             if(t[i].pos==t[i-1].pos) continue;
//             o=t[i].pos-t[i-1].pos;
//             ans=(ans+dp[i-1]*Q(v,o-1)%mod*(v-1)%mod*A(n-t[i].pos)%mod)%mod;
//         }
//         ans=((A(n-1)-ans)%mod+mod)%mod;
//         printf("%lld\n",ans);
//     }
//     return 0;
// }

#include<bits/stdc++.h>
const long long N=100000;
const long long mod=1e9+7;
using namespace std;
long long T,n,m,v,dp[N+5],res,hp,o,ans,lst,rd,rf;
struct node{
    long long pos,val;
    bool operator<(const node &o)const{
        return pos<o.pos;
    }
}t[N+5];
bool bz;
long long Q(long long x,long long y){
    res=1;
    while(y>0){
        if(y&1) res=res*x%mod;
        x=x*x%mod;
        y/=2;
    }
    return res;
}
long long A(long long x){
    return Q(v,2*x);
}
char c;
// long long Read(){
//     rd=0,rf=1;
//     c=getchar();
//     while(c<'0'||c>'9'){
//         if(c=='-') rf=-1;
//         c=getchar();
//     } 
//     while(c>='0'&&c<='9'){
//         rd=(rd<<1)+(rd<<2)+(c-'0');
//         c=getchar();
//     }
//     return rd*rf;
// }
int main(){
    freopen("assign.in","r",stdin);
    freopen("assign.out","w",stdout);
    scanf("%lld",&T);
    while(T--){
        ans=0;
        // n=Read();
        // m=Read();
        // v=Read();
        scanf("%lld%lld%lld",&n,&m,&v);
        for(int i=1;i<=m;i++){
            // t[i].pos=Read();
            // t[i].val=Read();
            scanf("%lld%lld",&t[i].pos,&t[i].val);
        }
        sort(t+1,t+1+m);
        bz=true;
        for(int i=2;i<=m;i++){
            if(t[i].pos==t[i-1].pos&&t[i].val!=t[i-1].val){
                bz=false;
                break;
            }
        }
        if(bz==false){
            printf("0\n");
            continue;
        }
        dp[1]=A(t[1].pos-1);
        for(int i=2;i<=m;i++){
            if(t[i].pos==t[i-1].pos){
                dp[i]=dp[i-1];
                continue;
            }
            o=t[i].pos-t[i-1].pos;
            lst=Q(v,o-1)*(v-1)%mod;
            hp=((A(o)-lst)%mod+mod)%mod;
            dp[i]=dp[i-1]*hp%mod;
            ans=(ans+dp[i-1]*lst%mod*A(n-t[i].pos)%mod)%mod;
        }
        ans=((A(n-1)-ans)%mod+mod)%mod;
        printf("%lld\n",ans);
    }
    return 0;
}