#include <iostream>
#include <math.h>
using namespace std;
#define max 1.8e+308
int main() {
int t;
cin>>t;
while(t>0)
{
double x1,x2,radius,y1,y2,c[2],x[2],y[2];
cin>>x1>>y1;
cin>>x2>>y2;
double length=pow((pow((x2-x1),2.0)+pow(y2-y1,2.0)),0.5);
long int t1;
cin>>t1;
while(t1>0)
{
cin>>x[0]>>y[0]>>radius;
double c2=(x[0]*x[0])+(y[0]*y[0])-(radius*radius);
c[0]=c2;
double m=(y2-y1)/(x2-x1);
x[1]=m;
y[1]=1;
double c1= y1-(m*x1);
c[1]=c1;
double D=pow((m*c1)-(y[0]*m)-x[0],2.0)-((1+(m*m))*((c1*c1)+c2-(2*y[0]*c1)));
D*=4.0;
double CD=0,arc=0,X1=0,X2=0,Y1=0,Y2=0;
if(D>0)
{
X1=(pow(D,0.5)-(2*(m*c1-y[0]*m-x[0])))/(2*(1+(m*m)));
X2=(-1)*(pow(D,0.5)+(2*(m*c1-y[0]*m-x[0])))/(2*(1+(m*m)));
Y1=m*X1+c1;
Y2=m*X2+c1;
CD=pow(pow(X2-X1,2)+pow(Y2-Y1,2),0.5);
arc=2*asin(CD/(2*radius));
arc*=radius;
}
length-=CD;
length+=arc;
t1--;
}
cout<<fmod(length,max)<<endl;
t--;
}
// your code goes here
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8bWF0aC5oPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwojZGVmaW5lIG1heCAxLjhlKzMwOAppbnQgbWFpbigpIHsKCWludCB0OwoJY2luPj50OwoJd2hpbGUodD4wKQoJewoJZG91YmxlIHgxLHgyLHJhZGl1cyx5MSx5MixjWzJdLHhbMl0seVsyXTsKCWNpbj4+eDE+PnkxOwoJY2luPj54Mj4+eTI7Cglkb3VibGUgbGVuZ3RoPXBvdygocG93KCh4Mi14MSksMi4wKStwb3coeTIteTEsMi4wKSksMC41KTsKCWxvbmcgaW50IHQxOwoJY2luPj50MTsKCXdoaWxlKHQxPjApCgl7CgljaW4+PnhbMF0+PnlbMF0+PnJhZGl1czsKCWRvdWJsZSBjMj0oeFswXSp4WzBdKSsoeVswXSp5WzBdKS0ocmFkaXVzKnJhZGl1cyk7CgljWzBdPWMyOwoJZG91YmxlIG09KHkyLXkxKS8oeDIteDEpOwoJeFsxXT1tOwoJeVsxXT0xOwoJZG91YmxlIGMxPSB5MS0obSp4MSk7CgljWzFdPWMxOwoJZG91YmxlIEQ9cG93KChtKmMxKS0oeVswXSptKS14WzBdLDIuMCktKCgxKyhtKm0pKSooKGMxKmMxKStjMi0oMip5WzBdKmMxKSkpOwogICAgICAgIEQqPTQuMDsKCWRvdWJsZSBDRD0wLGFyYz0wLFgxPTAsWDI9MCxZMT0wLFkyPTA7CglpZihEPjApCgl7CgkJIFgxPShwb3coRCwwLjUpLSgyKihtKmMxLXlbMF0qbS14WzBdKSkpLygyKigxKyhtKm0pKSk7CgkJIFgyPSgtMSkqKHBvdyhELDAuNSkrKDIqKG0qYzEteVswXSptLXhbMF0pKSkvKDIqKDErKG0qbSkpKTsKCQkgWTE9bSpYMStjMTsKCQkgWTI9bSpYMitjMTsKCQlDRD1wb3cocG93KFgyLVgxLDIpK3BvdyhZMi1ZMSwyKSwwLjUpOwoJCSBhcmM9Miphc2luKENELygyKnJhZGl1cykpOwogICAgICAgICBhcmMqPXJhZGl1czsKCQkKCX0KCSBsZW5ndGgtPUNEOwoJIGxlbmd0aCs9YXJjOyAKCSB0MS0tOwoJfQoJICBjb3V0PDxmbW9kKGxlbmd0aCxtYXgpPDxlbmRsOwoJdC0tOwoJfQoJLy8geW91ciBjb2RlIGdvZXMgaGVyZQoJcmV0dXJuIDA7Cn0=