#include<bits/stdc++.h>
using namespace std;
int n,S,t,A,B,T[100010],P;
double g[1010][1010],ans;
struct point{
int x,y;
};
point p[100010];
struct city{
int px1,py1,px2,py2,px3,py3,px4,py4;
};
city c[100010];
inline double sq(double x){
return x*x;
}
inline double gd(int px1,int py1,int px2,int py2){
return sqrt(sq(px1-px2)+sq(py1-py2));
}
inline bool iv(int px1,int py1,int px2,int py2,int px3,int py3){
if(px1==px2&&py1==py3) return 1;
if(px1==px3&&py1==py2) return 1;
int tx1,ty1,tx2,ty2,tmp;
tx1=px1-px2;
ty1=py1-py2;
tmp=__gcd(tx1,ty1);
tx1/=tmp,ty1/=tmp;
tx2=px1-px3;
ty2=py1-py3;
tmp=__gcd(tx2,ty2);
tx2/=tmp,ty2/=tmp;
return ((tx1==tx2&&ty1==-ty2)||(tx1==-tx2&&ty1==ty2));
}
inline void set_city(int px1,int py1,int px2,int py2,int px3,int py3,int cnt){
if(iv(px1,py1,px2,py2,px3,py3)) c[cnt]={px1,py1,px2,py2,px3,py3,px2+px3-px1,py2+py3-py1};
if(iv(px2,py2,px1,py1,px3,py3)) c[cnt]={px2,py2,px1,py1,px3,py3,px1+px3-px2,py1+py3-py2};
if(iv(px3,py3,px1,py1,px2,py2)) c[cnt]={px3,py3,px1,py1,px2,py2,px1+px2-px3,py1+py2-py3};
}
void setp(){
for(int i=1;i<=S;i++){
p[(i-1)*4+1]={c[i].px1,c[i].py1};
p[(i-1)*4+2]={c[i].px2,c[i].py2};
p[(i-1)*4+3]={c[i].px3,c[i].py3};
p[i*4]={c[i].px4,c[i].py4};
}
}
int main(){
scanf("%d",&n);
while(n--){
scanf("%d%d%d%d",&S,&t,&A,&B);
fill(T+1,T+1+S,0);
fill(p+1,p+1+S*4,(point){0,0});
for(int i=1,i1,i2,i3,i4,i5,i6;i<=S;i++){
scanf("%d%d%d%d%d%d%d",&i1,&i2,&i3,&i4,&i5,&i6,&T[i]);
set_city(i1,i2,i3,i4,i5,i6,i);
}
setp();
P=4*S;
for(int i=1;i<=P;i++) fill(g[i]+1,g[i]+P+1,99999999);
for(int i=1;i<=P;i++)
for(int j=1;j<=P;j++){
if(i==j) continue;
if((i-1)/4==(j-1)/4) g[i][j]=T[(i-1)/4+1]*gd(p[i].x,p[i].y,p[j].x,p[j].y);
else g[i][j]=t*gd(p[i].x,p[i].y,p[j].x,p[j].y);
}
for(int k=1;k<=P;k++)
for(int i=1;i<=P;i++)
for(int j=1;j<=P;j++)
if(i!=j) g[i][j]=min(g[i][j],g[i][k]+g[k][j]);
for(int i=1;i<=P;i++) g[i][i]=0;
ans=99999999;
for(int i=1;i<=4;i++)
for(int j=1;j<=4;j++)
ans=min(ans,g[i][(S-1)*4+j]);
printf("%.1lf\n",ans);
}
}