RT。用的 dijkstra 最短路。
//chenye3
#include<bits/stdc++.h>
#define ll long long
#define do double
#define re register
using namespace std;
struct node{
int pos;do dis;
bool operator <(const node &tmp)const{return tmp.dis<dis;}
};
const int maxm=1e6+5,maxn=1010;
int sx,sy,ex,ey;
int n;
struct point{
int x,y,z;
}a[maxn];
struct edge{
int v;do w;int next;
}e[maxm<<1];int head[maxn],cnt;
inline void add(int u,int v,do w){
e[++cnt]=edge{v,w,head[u]};
head[u]=cnt;
}
inline int sqr(int x){return x*x;}
inline do get(point x,point y){return sqrt(sqr(x.x-y.x)+sqr(x.y-y.y));}
do dis[maxn];bool vis[maxn];
inline void dijkstra(int s){
priority_queue<node>q;
memset(dis,0x3f,sizeof(dis));
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=1;j<i;++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;
}