#include<cstdio>
#include<cmath>
#include<cstring>
#include<queue>
#include<utility>
#include<vector>
using namespace std;
struct City
{
int x[5],y[5];
int ti;
}cts[105];
int s,t,A,B;
const int N=105;
double dist(int x1,int y1,int x2,int y2)
{
int x=x1-x2,y=y1-y2;
return sqrt(x*x+y*y);
}
inline int max(const int x,const int y){return x>=y?x:y;}
int triplemax(const int x,const int y,const int z){return max(max(x,y),z);}
inline double min(const double x,const double y){return x<=y?x:y;}
int calc4x(int x)
{
City cur=cts[x];
int abdis=dist(cur.x[1],cur.y[1],cur.x[2],cur.y[2]);
int acdis=dist(cur.x[1],cur.y[1],cur.x[3],cur.y[3]);
int bcdis=dist(cur.x[2],cur.y[2],cur.x[3],cur.y[3]);
if(triplemax(abdis,acdis,bcdis)==abdis) return cur.x[1]+cur.x[2]-cur.x[3];
else if(triplemax(abdis,acdis,bcdis)==bcdis) return cur.x[2]+cur.x[3]-cur.x[1];
else return cur.x[1]+cur.x[3]-cur.x[2];
}
int calc4y(int x)
{
City cur=cts[x];
int abdis=dist(cur.x[1],cur.y[1],cur.x[2],cur.y[2]);
int acdis=dist(cur.x[1],cur.y[1],cur.x[3],cur.y[3]);
int bcdis=dist(cur.x[2],cur.y[2],cur.x[3],cur.y[3]);
if(triplemax(abdis,acdis,bcdis)==abdis) return cur.y[1]+cur.y[2]-cur.y[3];
else if(triplemax(abdis,acdis,bcdis)==bcdis) return cur.y[2]+cur.y[3]-cur.y[1];
else return cur.y[1]+cur.y[3]-cur.y[2];
}
const int NN=405;
vector<pair<int,double> > G[NN];
void build()
{
for(int i=1;i<=s;i++)
for(int j=1;j<=4;j++)
for(int k=1;k<=4;k++)
{
if(j==k) continue;
double cur=1.0*cts[i].ti*dist(cts[i].x[j],cts[i].y[j],cts[i].x[k],cts[i].y[k]);
G[i*4+j].push_back(make_pair(i*4+k,cur));
}
for(int i=1;i<=s;i++)
for(int j=1;j<=s;j++)
{
if(i==j) continue;
for(int k=1;k<=4;k++)
for(int l=1;l<=4;l++)
{
double cur=1.0*t*dist(cts[i].x[k],cts[i].y[k],cts[j].x[l],cts[j].y[l]);
G[i*4+k].push_back(make_pair(j*4+l,cur));
}
}
}
struct Node
{
int v;
double w;
friend bool operator <(const Node &x,const Node &y){return x.w>y.w;}
};
Node make_node(const int v,const double w)
{
Node ans;
ans.v=v;ans.w=w;
return ans;
}
bool vis[NN];
double dis[NN];
priority_queue<Node> pq;
void Dijkstra(int st)
{
for(int i=1;i<=NN-5;i++) dis[i]=1e6;
memset(vis,0,sizeof vis);
dis[st]=0.0;
pq.push(make_node(st,dis[st]));
while(!pq.empty())
{
Node cur=pq.top();
pq.pop();
int u=cur.v;
if(vis[u]) continue;
vis[u]=true;
vector<pair<int,double> >::iterator it=G[u].begin();
for(;it!=G[u].end();it++)
{
int v=it->first;
double w=it->second;
if((!vis[v])&&dis[u]+w<dis[v])
{
dis[v]=dis[u]+w;
pq.push(make_node(v,dis[v]));
}
}
}
return;
}
void work()
{
scanf("%d%d%d%d",&s,&t,&A,&B);
for(int i=1;i<=s;i++)
{
scanf("%d%d%d%d%d%d%d",&cts[i].x[1],&cts[i].y[1],&cts[i].x[2],&cts[i].y[2],&cts[i].x[3],&cts[i].y[3],&cts[i].ti);
cts[i].x[4]=calc4x(i);
cts[i].y[4]=calc4y(i);
}
build();
double ans=1e6;
for(int i=1;i<=4;i++)
{
Dijkstra(A*4+i);
for(int j=1;j<=4;j++) printf("%d %d %.1lf\n",A*4+i,B*4+j,dis[B*4+j]);
}
printf("%.1lf\n",ans);
}
int main()
{
int T;
scanf("%d",&T);
while(T--) work();
return 0;
}