https://ac.nowcoder.com/acm/contest/201/L
#include<bits/stdc++.h>
#include<iostream>
#include<algorithm>
#define maxn 1200
#define inf 9999999
using namespace std;
typedef pair<double,int>P;
double a,b,c1,c2;
int n;
struct node{
double x;
double y;
double r;
}ac[maxn];
double M[maxn][maxn];
double dist[maxn];
int vist[maxn];
void init(){
for(int i=0;i<=n+1;i++){
for(int j=0;j<=n+1;j++){
M[i][j]=inf;
}
M[i][i]=0;
}
}
void dijstra(){
fill(dist, dist + 1003, 1e18);
priority_queue<P,vector<P>,greater<P> >q;
dist[0]=0;
q.push(P(0,0));
while(!q.empty()){
P u=q.top();
q.pop();
int x=u.second;
if(u.first>dist[x])
continue;
for(int i=0;i<=n+1;i++){
if(M[x][i]+dist[x]<dist[i]){
dist[i]=M[x][i]+dist[x];
q.push(P(dist[i],i));
}
}
}
}
/*
void dijstra(){
for(int i=0;i<=n+1;i++){
dist[i]=M[i][0];
}
// for(int i=0;i<=n+1;i++)
// {
// printf("dis[%d] = %.3lf\n",i,dist[i]);
// }
memset(vist,0,sizeof(vist));
dist[0]=0;
vist[0]=1;
for(int i=1;i<=n+1;i++){
int v=-1,maxx=999999999;
for(int j=0;j<=n+1;j++){
if(!vist[j]&&dist[j]<=maxx){
maxx=dist[j];
v=j;
}
}
if(v==-1) return ;
vist[v]=1;
// printf("%d\n",v);
for(int k=1;k<=n+1;k++){
if(!vist[k]&&dist[v]+M[v][k]<=dist[k]){
dist[k]=dist[v]+M[v][k];
//printf("asdfasdf\n");
//vist[k]=1;
}
}
}
}*/
int main(){
double dis1,dis2,dis3;
cin>>n>>a>>b>>c1>>c2;
init();
for(int i=1;i<=n;i++){
cin>>ac[i].x>>ac[i].y>>ac[i].r;
dis1=fabs(a*ac[i].x+b*ac[i].y+c1)/sqrt(a*a+b*b);
M[0][i]=M[i][0]=dis1<=ac[i].r?0:(dis1-ac[i].r);
dis2=fabs(a*ac[i].x+b*ac[i].y+c2)/sqrt(a*a+b*b);
M[i][n+1]=M[n+1][i]=dis2<=ac[i].r?0:(dis2-ac[i].r);
//cout<<fabs(a*ac[i].x+b*ac[i]. y+c1)*1.0/sqrt(a*a+b*b)<<" "<<fabs(a*ac[i].x+b*ac[i].y+c2)/sqrt(a*a+b*b)<<endl;
}
M[0][n+1]=M[n+1][0]=fabs(c1-c2)/sqrt(a*a+b*b);
for(int i=1;i<n;i++){
for(int j=i+1;j<=n;j++){
dis3=sqrt((ac[j].x-ac[i].x)*(ac[j].x-ac[i].x)+(ac[j].y-ac[i].y)*(ac[j].y-ac[i].y));
M[i][j]=M[j][i]=dis3<=(ac[i].r+ac[j].r)?0:(dis3-(ac[i].r+ac[j].r));
}
}
dijstra();
printf("%.6lf\n",dist[n+1]);
// cout<<dist[n+1]<<endl;
return 0;
}