#include<queue>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<iostream>
#include<cmath>
using namespace std;
typedef long long ll;
double dis[1007][1007];
double r[1007],x[1007],y[1007];
double ds[1007];
bool vis[1007];
int n;
queue<int > q;
void dijkstra()
{
  for(int i=1;i<=n;i++)
  ds[i]=1e10;
  ds[1]=0;
  q.push(1);
  while(q.size())
  {
   int u=q.front();
   q.pop();
   vis[u]=0;
   for(int i=1;i<=n;i++)
   {
   	 if(i==u) continue;
   	 if(ds[u]+dis[u][i]<ds[i])
   	 {
   	    ds[i]=ds[u]+dis[u][i];
   	    if(!vis[i])
   	    {
   	     q.push(i);
			vis[i]=1;	
   	    }
   	 }
   }
  }
}
int main()
{
 while(scanf("%lf%lf%lf%lf",&x[1],&y[1],&x[2],&y[2])!=EOF)
 {
   memset(vis,0,sizeof(vis));
   scanf("%d",&n);
   n+=2;
   for(int i=3;i<=n;i++)
   scanf("%lf%lf%lf",&x[i],&y[i],&r[i]);
   r[1]=r[2]=0;
   for(int i=1;i<=n;i++)
   {
    for(int j=1;j<=n;j++)
    {
      	double tmp=sqrt((x[i]-x[j])*(x[i]-x[j])+(y[i]-y[j])*(y[i]-y[j]));
      	tmp-=(r[i]+r[j]);
      	if(tmp<0)
      	dis[i][j]=0;
      	else dis[i][j]=tmp;
    }
   }
   dijkstra();
   printf("%.10lf\n",ds[2]);
 }
 return 0;	
}