#include<cstdio>
#include<cstring>
#include<cmath>
#include<climits>
#include<queue>
#include<algorithm>
using namespace std;
#define N 5000
struct mzls
{
	int to;
	double cost;
}as;
struct mzls1
{
	double x,y,z;
}a1[N+5];
vector<mzls>g[N+5];
queue<int>q;
bool f[N+5],f1;
int n;
double dist[N+5];
inline void prepare()
{
	scanf("%lf%lf%lf%lf",&a1[1].x,&a1[1].y,&a1[2].x,&a1[2].y);
	a1[1].z=a1[2].z=0;
	dist[1]=dist[2]=1e18;
	scanf("%d",&n);
	n+=2;
	for(int i=3;i<=n;i++)
	{
		scanf("%lf%lf%lf",&a1[i].x,&a1[i].y,&a1[i].z);
		dist[i]=1e18;
	}
	for(int i=2;i<=n;i++)
		for(int j=1;j<i;j++)
		{
			double ml=sqrt((a1[i].x-a1[j].x)*(a1[i].x-a1[j].x)+(a1[i].y-a1[j].y)*(a1[i].y-a1[j].y));
			ml-=a1[i].z+a1[j].z;
			if(ml<0.0)
				ml=0.0;
			as.cost=ml;
			as.to=j;
			g[i].push_back(as);
			as.to=i;
			g[j].push_back(as);
		}
}
inline void SPFA(int s)
{
	dist[s]=0,f[s]=1;
	q.push(s);
	while(!q.empty())
	{
		int v=q.front();q.pop();
		f[v]=0;
		for(int i=0;i<g[v].size();i++)
		{
			mzls ml=g[v][i];
			if(dist[ml.to]>dist[v]+ml.cost)
			{
				dist[ml.to]=dist[v]+ml.cost;
				if(!f[ml.to])
				{
					q.push(ml.to);
					f[ml.to]=1;
				}
			}
		}
	}
}
int main()
{
	prepare();
	SPFA(1);
	printf("%.10lf\n",dist[2]);
}

