#include <bits/stdc++.h>
using namespace std;
template <class T>
inline bool umx(T& A, const T& B) {
  return A < B ? A = B, 1 : 0;
}
template <class T>
inline bool umn(T& A, const T& B) {
  return A > B ? A = B, 1 : 0;
}
const double INF = 1e10;
const double eps = 1e-12;
const double pi = acos(-1.);
struct po {
  double x, y;
  po(double x = 0, double y = 0) : x(x), y(y){};
};
po operator+(po a, po b) { return po(a.x + b.x, a.y + b.y); }
po operator-(po a, po b) { return po(a.x - b.x, a.y - b.y); }
po operator*(po a, double b) { return po(a.x * b, a.y * b); }
po operator/(po a, double b) { return po(a.x / b, a.y / b); }
double dot(po a, po b) { return a.x * b.x + a.y * b.y; }
double abs(po a) { return sqrt(dot(a, a)); }
po unit(po a) { return a / abs(a); }
void read(po& a) {
  int x, y;
  scanf("%d%d", &x, &y);
  a = po(x, y);
}
int main() {
  po a, b, p, v;
  int n;
  read(a);
  read(b);
  p = (a + b) / 2., v = unit(b - a);
  swap(v.x, v.y);
  v.x = -v.x;
  scanf("%d", &n);
  vector<pair<double, int> > vl, vr;
  int cv = 0;
  for (int i = (0), i_end_ = (n); i < i_end_; ++i) {
    po c;
    int rr;
    read(c);
    scanf("%d", &rr);
    double L, R, l, r;
    if (dot(v, c - p) > 0) {
      l = -INF, r = INF;
      for (int z = (0), z_end_ = (70); z < z_end_; ++z) {
        double m = (l + r) / 2.;
        po cm = p + v * m;
        if (abs(c - cm) > rr + abs(a - cm))
          l = m;
        else
          r = m;
      }
      L = (l + r) / 2.;
      l = -INF, r = INF;
      for (int z = (0), z_end_ = (70); z < z_end_; ++z) {
        double m = (l + r) / 2.;
        po cm = p + v * m;
        if (abs(c - cm) > abs(a - cm) - rr)
          l = m;
        else
          r = m;
      }
      R = (l + r) / 2.;
    } else {
      l = -INF, r = INF;
      for (int z = (0), z_end_ = (70); z < z_end_; ++z) {
        double m = (l + r) / 2.;
        po cm = p + v * m;
        if (abs(c - cm) > rr + abs(a - cm))
          r = m;
        else
          l = m;
      }
      R = (l + r) / 2.;
      l = -INF, r = INF;
      for (int z = (0), z_end_ = (70); z < z_end_; ++z) {
        double m = (l + r) / 2.;
        po cm = p + v * m;
        if (abs(c - cm) > abs(a - cm) - rr)
          r = m;
        else
          l = m;
      }
      L = (l + r) / 2.;
    }
    if (L < 0 && R > 0) ++cv;
    if (L > 0)
      vr.push_back({L, 1});
    else
      vl.push_back({L, -1});
    if (R > 0)
      vr.push_back({R, -1});
    else
      vl.push_back({R, 1});
  }
  if (cv == 0) {
    printf("%.10f\n", abs(p - a));
  } else {
    double res = INF;
    sort(vr.begin(), vr.end());
    int cvp = cv;
    for (auto x : vr) {
      cvp += x.second;
      if (cvp == 0) {
        umn(res, abs(p + v * x.first - a));
        break;
      }
    }
    sort(vl.begin(), vl.end());
    reverse(vl.begin(), vl.end());
    cvp = cv;
    for (auto x : vl) {
      cvp += x.second;
      if (cvp == 0) {
        umn(res, abs(p + v * x.first - a));
        break;
      }
    }
    printf("%.10f\n", res);
  }
  return 0;
}
