#include<bits/stdc++.h>
#include<unordered_map>
using namespace std;
class graph{
map<int,list<pair<int,int> > >m;
public:
void add_edge(int u,int v,int z){
m[u].push_back(make_pair(v,z));
m[v].push_back(make_pair(u,z));
}
void bfs(int m1,int src,int costt,bool visited[],int distance[],int temple[]){
distance[src]=0;
temple[src]=1;
queue<pair<int,int> > q;
q.push(make_pair(src,0));
int e=0;
while(!q.empty()){
auto p=q.front();
q.pop();
visited[p.first]=true;
int dist=p.second;
for(auto i:m[p.first]){
if(!visited[i.first]){
visited[i.first]=true;
distance[i.first]=dist+i.second;
if(costt<distance[i.first]){
temple[i.first]=1;
if(e==0)
e=i.first;
distance[i.first]=0;
}
q.push(make_pair(i.first,distance[i.first]));
}
}
temple[src]=2;
for(int i=1;i<=m1;i++){
if(temple[i]==1){
q.push(make_pair(temple[i],0));
temple[i]=2;
}
}
// q.push(make_pair(temple[e],0));
}
//cout<<"ee"<<endl;
}
};
int main(){
int t;
cin>>t;
while(t--){
graph g;
int m,n,a,b;
cin>>m>>n>>a>>b;
int src=0;
for(int i=0;i<n;i++){
int u,v;
cin>>u>>v;
if(src==0)src=u;
g.add_edge(u,v,b);
}
bool visited[m+1];
for(int i=1;i<=m;i++){
visited[i]=false;
}
int temple[m+1];
for(int i=1;i<=m;i++){
temple[i]=0;
}
int distance[m+1];
for(int i=1;i<=m;i++) distance[i]=INT_MAX;
for(int i=1;i<=m;i++){
if(!visited[i]){
g.bfs(m,i,a,visited,distance,temple);
}
}
int sum=0;
for(int i=1;i<=m;i++){
if(temple[i]==2){
sum+=a;
}
}
for(int j=1;j<=m;j++){
if(distance[j]>0 && distance[j]!=INT_MAX)
sum+=distance[j];
}
cout<<sum<<endl;
}
}
please tell wts wrong