/*
建立两个虚拟远点 0 和 n+1 ,分别为 c1 和 c2 的虚拟远点
但是
不用看了 数据太水了
*/

#include <bits/stdc++.h>

using namespace std;

typedef double ld;

const int N = 1010;

int n;
ld A,B,c1,c2;
ld g[N][N],d[N];
bool str[N];

ld path(ld A,ld B,ld c,ld x,ld y) //点到直线的距离
{
	return abs(A*x+B*y+c)/sqrt(A*A+B*B);
}

struct Node
{
	ld x,y,r;
}a[N];

void dijkstra()
{
	//memset(d,1e9,sizeof N*2);
    for(int i=0;i<=n+1;i++) d[i]=1e9;
	d[0]=0;
	
	for(int i=0;i<=n+1;i++)
	{
		int t=-1;
		for(int j=0;j<=n+1;j++)
		{
			if(!str[j]&&(t==-1||d[t]>d[j]))
			{
				t=j;
			}
		}
		
		for(int j=0;j<=n+1;j++)
		{
			d[j]=min(d[j],d[t]+g[t][j]);
		}
		str[t]=true;
	}
	
	cout<<d[n+1]<<'\n';
}

int main()
{
	cin>>n>>A>>B>>c1>>c2;
	g[0][n+1]=g[n+1][0]=1e9;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].x>>a[i].y>>a[i].r;
		ld x1=a[i].x,y1=a[i].y,r1=a[i].r;
		g[0][i]=g[i][0]=max(0.0,path(A,B,c1,x1,y1)-r1);
		g[n+1][i]=g[i][n+1]=max(0.0,path(A,B,c2,x1,y1)-r1);
	}
	
	for(int i=1;i<=n;i++)
		for(int j=i+1;j<=n;j++)
		{
			g[i][j]=g[j][i]=max(0.0,sqrt((a[i].x-a[j].x)*(a[i].x-a[j].x)+(a[i].y-a[j].y)*(a[i].y-a[j].y))-a[i].r-a[j].r);
		}
		
	dijkstra();
	
	return 0;
}