#include <cstdio>
#include <cmath>
using namespace std;
#define MAXS 101
#define INF __DBL_MAX__
int n, S, T, A, B;
double t[MAXS], ans = INF;
double e[MAXS * 4][MAXS * 4];
struct Node {
int x, y, id;
} a[MAXS * 4];
double min(double x, double y) {
return x<y ? x : y;
}
int sq(int x) {
return x * x;
}
int dis_sq(int x1, int y1, int x2, int y2) {
return sq(x1 - x2) + sq(y1 - y2);
}
double dist(int x1, int y1, int x2, int y2) {
return sqrt(dis_sq(x1, y1, x2, y2));
}
void GetCoord(int x1, int y1, int x2, int y2, int x3, int y3, int id) {
int ab = dis_sq(x1, y1, x2, y2);
int bc = dis_sq(x2, y2, x3, y3);
int ac = dis_sq(x1, y1, x3, y3);
int x4, y4;
if (ab + ac == bc)
x4 = x2 + x3 - x1, y4 = y2 + y3 - y1;
if (ab + bc == ac)
x4 = x1 + x3 - x2, y4 = y1 + y3 - y2;
if (bc + ac == ab)
x4 = x1 + x2 - x3, y4 = y1 + y2 - y3;
a[id*4] = (Node){x4, y4, id};
}
double Value(Node u, Node v) {
double dis = dist(u.x, u.y, v.x, v.y);
if (u.id == v.id)
return dis * t[u.id];
else
return dis * T;
}
int main() {
scanf("%d", &n);
while (n--) {
scanf("%d%d%d%d", &S, &T, &A, &B);
for (int i = 1; i <= S*4; i += 4) {
int city = i / 4 + 1;
scanf("%d%d%d%d%d%d%lf", &a[i].x, &a[i].y, &a[i+1].x, &a[i+1].y, &a[i+2].x, &a[i+2].y, &a[i+3].x, &a[i+3].y, t[city]);
a[i].id = a[i+1].id = a[i+2].id = a[i+3].id = city;
GetCoord(a[i].x, a[i].y, a[i+1].x, a[i+1].y, a[i+2].x, a[i+2].y, city);
}
for (int i = 1; i <= S*4; i++)
for (int j = 1; j <= S*4; j++)
e[i][j] = Value(a[i], a[j]);
for (int k = 1; k <= S*4; k++)
for (int i = 1; i <= S*4; i++)
for (int j = 1; j <= S*4; j++)
if (i != j && j != k)
e[i][j] = min(e[i][j], e[i][k] + e[k][j]);
for (int i = A*4-3; i <= A*4; i++)
for (int j = B*4-3; j <= B*4; j++)
ans = min(ans, e[i][j]);
printf("%.1lf\n", ans);
}
return 0;
}