#include <bits/stdc++.h>
using namespace std;
#define pr pair <double ,int >
#define f first
#define s second
#define mmp(a,b) make_pair(a,b)
priority_queue <pr > Q;
const int N=1005,E=2500005;
int Head[N],Next[E],Adj[E],tot=0;
double Weight[E];
inline void addedge(int u,int v,double w){
	Next[++tot]=Head[u],Head[u]=tot,Adj[tot]=v,Weight[tot]=w;
	Next[++tot]=Head[v],Head[v]=tot,Adj[tot]=u,Weight[tot]=w;
}
bool vis[N];int n;
double dis[N];
inline void dijkstra() {
	for (int i=1;i<=n+2;i++) dis[i]=100000000000.0;
	dis[1]=0;
	Q.push(mmp(0.0,1));
	while (!Q.empty()) {
		pr x=Q.top();Q.pop();
		if (vis[x.s]) continue;
		vis[x.s]=true;
		for (int e=Head[x.s]; e; e=Next[e])
			if (dis[x.s]+Weight[e]<dis[Adj[e]]) {
				dis[Adj[e]]=dis[x.s]+Weight[e];
				Q.push(mmp(-dis[Adj[e]],Adj[e]));
			}
	}
}
double x[N],y[N],r[N];
inline double dist(int t1,int t2){
	return sqrt((x[t1]-x[t2])*(x[t1]-x[t2])+(y[t1]-y[t2])*(y[t1]-y[t2]));
}
int main (){
	scanf ("%lf%lf%lf%lf",&x[1],&y[1],&x[2],&y[2]);
	scanf ("%d",&n);
	for (int i=1;i<=n;i++) scanf ("%lf%lf%lf",&x[i+2],&y[i+2],&r[i+2]);
	for (int i=1;i<=n+2;i++)
		for (int j=i+1;j<=n+2;j++)
			addedge(i,j,max(dist(i,j)-r[i]-r[j],0.0));
	dijkstra();
	printf ("%.12f",dis[2]);
	return 0;
}
