RT。
//chenye3
#include<bits/stdc++.h>
#define ll long long
#define re register
using namespace std;
struct node{
int pos;double dis;
bool operator <(const node &tmp)const{return tmp.dis<dis;}
};
const int maxm=1e7+5,maxn=3010;
int sx,sy,ex,ey;
int n;
struct point{
int x,y,z;
}a[maxn];
struct edge{
int v,next;double w;
}e[maxm<<1];int head[maxn],cnt;
inline void add(int u,int v,double w){
e[++cnt]=edge{v,head[u],w};
head[u]=cnt;
}
inline double get(point x,point y){return sqrt((long long)(x.x-y.x)*(x.x-y.x)+(long long)(x.y-y.y)*(x.y-y.y));}
double dis[maxn];bool vis[maxn];
inline void dijkstra(int s){
priority_queue<node>q;
for(int i=1;i<=n;++i) dis[i]=10000000000000.0;
memset(vis,0,sizeof(vis));
q.push(node{s,0});dis[s]=0.0;
while(!q.empty()){
node tmp=q.top();q.pop();
int u=tmp.pos;
vis[u]=1;
for(int i=head[u];i;i=e[i].next){
int v=e[i].v;
if(dis[v]>dis[u]+e[i].w){
dis[v]=dis[u]+e[i].w;
if(!vis[v]) q.push(node{v,dis[v]});
}
}
}
}
signed main(){
scanf("%d%d%d%d",&sx,&sy,&ex,&ey);
scanf("%d",&n);
a[1]=point{sx,sy,0};
for(int i=2;i<=n+1;++i)
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
n+=2;
a[n]=point{ex,ey,0};
for(int i=1;i<=n;++i)
for(int j=i+1;j<=n;++j){
add(i,j,max(0.0,get(a[i],a[j])-(a[i].z+a[j].z)));
add(j,i,max(0.0,get(a[i],a[j])-(a[i].z+a[j].z)));
}
dijkstra(1);
printf("%.10lf",dis[n]);
return 0;
int rp;
while(1) rp++;
}