#include <bits/stdc++.h>
using namespace std;
bool debug = 0;
int n, m, k;
int dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
string direc = "RDLU";
long long ln, lk, lm;
void etp(bool f = 0) {
  puts(f ? "YES" : "NO");
  exit(0);
}
void addmod(int& x, int y, int mod = 1000000007) {
  assert(y >= 0);
  x += y;
  if (x >= mod) x -= mod;
  assert(x >= 0 && x < mod);
}
void et() {
  puts("-1");
  exit(0);
}
long long fastPow(long long x, long long y, int mod = 1000000007) {
  long long ans = 1;
  while (y > 0) {
    if (y & 1) ans = (x * ans) % mod;
    x = x * x % mod;
    y >>= 1;
  }
  return ans;
}
long long gcd1(long long x, long long y) {
  long long z = y;
  while (x % y != 0) {
    z = x % y;
    x = y;
    y = z;
  }
  return z;
}
struct Point {
  long double x, y;
  Point() {}
  Point(long double x, long double y) : x(x), y(y) {}
  long double abs() const { return hypot(x, y); }
  Point operator+(const Point& o) const { return Point(x + o.x, y + o.y); }
  Point operator-(const Point& o) const { return Point(x - o.x, y - o.y); }
  void readin() { scanf("%Lf%Lf", &x, &y); }
} A, B, Q;
long double x, y, r;
long double cal(long double T) {
  long double rx = (A.x + B.x) / 2 + (A.y - B.y) * T;
  long double ry = (A.y + B.y) / 2 + (B.x - A.x) * T;
  Point cen = Point(rx, ry);
  return (cen - A).abs() - (cen - Q).abs();
}
long double gk(long double r) {
  long double L = -1e12, R = 1e12;
  int tmp = cal(L) > r;
  for (int(cc) = 0; (cc) < (int)(100); (cc)++) {
    long double mid = (L + R) / 2;
    int zz = cal(mid) > r;
    if (zz == tmp)
      L = mid;
    else
      R = mid;
  }
  return L;
}
vector<pair<long double, int>> vp;
void fmain(int ID) {
  A.readin();
  B.readin();
  scanf("%d", &n);
  for (int(i) = 1; (i) <= (int)(n); (i)++) {
    scanf("%Lf%Lf%Lf", &x, &y, &r);
    Q = Point(x, y);
    long double L = gk(r), R = gk(-r);
    if (R < L) swap(L, R);
    vp.push_back({L, 1});
    vp.push_back({R, -1});
  }
  vp.push_back({0, 0});
  sort(vp.begin(), vp.end());
  long double ans = 1e12;
  for (int i = 0, j = 0; i < vp.size(); i++) {
    if (j == 0) ans = min(ans, fabs(vp[i].first));
    j += vp[i].second;
    if (j == 0) ans = min(ans, fabs(vp[i].first));
  }
  printf("%.10Lf\n", sqrt(0.25 + ans * ans) * (A - B).abs());
}
int main() {
  int t = 1;
  for (int(i) = 1; (i) <= (int)(t); (i)++) {
    fmain(i);
  }
  return 0;
}
