#include <bits/stdc++.h>
using std::abs;
using std::array;
using std::cerr;
using std::cin;
using std::cout;
using std::generate;
using std::make_pair;
using std::map;
using std::max;
using std::max_element;
using std::min;
using std::min_element;
using std::pair;
using std::reverse;
using std::set;
using std::sort;
using std::string;
using std::unique;
using std::vector;
template <typename T>
T input() {
  T res;
  cin >> res;
  {};
  return res;
}
template <typename IT>
void input_seq(IT b, IT e) {
  std::generate(b, e,
                input<typename std::remove_reference<decltype(*b)>::type>);
}
struct event {
  long double tm;
  int elem;
  bool open;
};
int check(long double x1, long double y1, long double r1, long double x2,
          long double y2, long double r2) {
  long double dst2 = (x2 - x1) * (x2 - x1) + (y2 - y1) * (y2 - y1);
  if (dst2 < (r1 - r2) * (r1 - r2)) return -1;
  if (dst2 > (r1 + r2) * (r1 + r2)) return 1;
  return 0;
}
int main() {
  std::iostream::sync_with_stdio(false);
  cin.tie(nullptr);
  cout.tie(nullptr);
  int x0, y0, x2, y2;
  cin >> x0 >> y0 >> x2 >> y2;
  int n = input<int>();
  long double x1 = (x0 + x2) / 2.0;
  long double y1 = (y0 + y2) / 2.0;
  long double vx = -(y2 - y0);
  long double vy = x2 - x0;
  {
    long double vv = std::sqrt(vx * vx + vy * vy);
    vx /= vv;
    vy /= vv;
  }
  vector<pair<long double, int>> events;
  long double err = 0.0;
  for (int i = 0; i != n; ++i) {
    int x, y, r;
    cin >> x >> y >> r;
    auto f = [&](long double d) {
      long double cx = x1 + vx * d;
      long double cy = y1 + vy * d;
      int t = check(
          cx, cy,
          std::sqrt(d * d + (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0)), x,
          y, r);
      return t;
    };
    int64_t f1 = (-(y2 - y0)) * 1ll * x + (x2 - x0) * 1ll * y;
    int64_t f0 = (-(y2 - y0)) * 1ll * x2 + (x2 - x0) * 1ll * y2;
    int tp = (f1 > f0 ? -1 : +1);
    int bt = (f1 > f0 ? +1 : -1);
    long double hi = 1.1e12;
    long double lo = -1.1e12;
    for (int iter = 0; iter != 150; ++iter) {
      auto mi = lo + (hi - lo) / 2;
      if (f(mi) == tp)
        hi = mi;
      else
        lo = mi;
    }
    err = max(err, hi - lo);
    long double B2 = hi;
    hi = 1.1e12;
    lo = -1.1e12;
    for (int iter = 0; iter != 150; ++iter) {
      auto mi = lo + (hi - lo) / 2;
      if (f(mi) == bt)
        lo = mi;
      else
        hi = mi;
    }
    err = max(err, hi - lo);
    long double B1 = lo;
    events.emplace_back(B1, i);
    events.emplace_back(B2, i);
    assert(B1 <= B2);
  }
  cerr << err << "\n";
  std::sort(events.begin(), events.end());
  vector<char> open(n, false);
  int n_open = 0;
  long double ans = 1e18;
  long double prev = -2e12;
  for (auto elem : events) {
    if (n_open == 0) {
      ans = min(ans, abs(elem.first));
      if (prev <= 0 and 0 <= elem.first) ans = 0;
    }
    if (open[elem.second])
      n_open -= 1;
    else
      n_open += 1;
    open[elem.second] ^= 1;
    prev = elem.first;
    if (n_open == 0) {
      ans = min(ans, abs(elem.first));
    }
  }
  if (prev <= 0) ans = 0;
  cout << std::fixed;
  cout.precision(10);
  cout << std::sqrt(ans * ans + (x1 - x0) * (x1 - x0) + (y1 - y0) * (y1 - y0))
       << "\n";
  return 0;
}
