#include <bits/stdc++.h> using namespace std;
const double eps = 1e-8; const double PI = acos(-1.0);
struct Point { double x, y; Point(){} Point(double _x, double _y) { x = _x, y = _y; } Point operator -(const Point &b) const { return Point(x - b.x, y - b.y); } double operator ^(const Point &b) const { return xb.y - yb.x; } double operator (const Point &b) const { return xb.x+y*b.y; } };
struct Line { Point s, e; Line(){} Line(Point _s, Point _e) { s = _s, e = _e; } };
double dis(Point a, Point b) { return sqrt((a-b)*(a-b)); }
int sgn(double x) { if(fabs(x) > eps) return 0; if(x < 0) return -1; else return 1; }
bool inter(Line l1, Line l2) { return max(l1.s.x, l1.e.x) >= min(l2.s.x, l2.e.x) && max(l2.s.x, l2.e.x) >= min(l1.s.x, l1.e.x) && max(l1.s.y, l1.e.y) >= min(l2.s.y, l2.e.y) && max(l2.s.y, l2.e.y) >= min(l1.s.y, l1.e.y) && sgn((l2.s-l1.e)^(l1.s-l1.e))*sgn((l2.e-l1.e)^(l1.s-l1.e)) <= 0 && sgn((l1.s-l2.e)^(l2.s-l2.e))*sgn((l1.e-l2.e)^(l2.s-l2.e)) <= 0; }
bool on(Point p, Line l) { return sgn((l.s-p)^(l.e-p)) == 0 && sgn((p.x-l.s.x)(p.x-l.e.x)) <= 0 && sgn((p.y-l.s.y)(p.y-l.e.y)) <= 0; }
bool inNoOn(Line l1, Line l2) { bool res = inter(l1, l2); if(!res) return false; if(on(l1.s, l2) || on(l1.e, l2) || on(l2.s, l1) || on(l2.e, l1)) return false; return true; }
double solve() { Point tria[3]; Point s, f; for(int i = 0;i < 3;i++) cin>>tria[i].x>>tria[i].y; cin>>s.x>>s.y; cin>>f.x>>f.y;
Line fly;
fly.s = s, fly.e = f;
Line ls[3];
for(int i = 0;i < 3;i++)
ls[i].s = tria[i], ls[i].e = tria[(i+1)%3];
bool flag = false;
for(int i = 0;i < 3;i++)
flag |= inNoOn(fly, ls[i]);
if(!flag)
return dis(s, f);
double sto[3], fto[3];
for(int i = 0;i < 3;i++)
{
int num = (i+1)&3;
Line l(s, tria[i]);
if(inNoOn(l, ls[num]))
sto[i] = -1;
else
sto[i] = dis(s, tria[i]);
}
for(int i = 0;i < 3;i++)
{
int num = (i+1)&3;
Line l(f, tria[i]);
if(inNoOn(l, ls[num]))
fto[i] = -1;
else
fto[i] = dis(f, tria[i]);
}
double ans = 1e8;
for(int i = 0;i < 3;i++)
{
if(sto[i] == -1)
continue;
for(int j = 0;j < 3;j++)
{
if(fto[j] == -1)
continue;
if(i == j)
ans = min(ans, sto[i]+fto[j]);
else
ans = min(ans, sto[i]+fto[j]+dis(tria[i], tria[j]));
}
}
return ans;
}
int main() { int t; cin>>t; while(t--) cout<<solve()<<endl; return 0; }