#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const double INF = 1e12;
const int MOD = 1e9 + 7;
const double EPS = 1e-6;
struct Point {
  double x, y;
  Point(double x = 0, double y = 0) {
    this->x = x;
    this->y = y;
  }
  Point operator-(const Point &rhs) const {
    return Point(x - rhs.x, y - rhs.y);
  }
  Point operator+(const Point &rhs) const {
    return Point(x + rhs.x, y + rhs.y);
  }
  Point operator*(double p) const { return Point(x * p, y * p); }
};
Point A, B;
vector<pair<double, int>> vL, vR;
int n;
double dot(Point v1, Point v2) { return v1.x * v2.x + v1.y * v2.y; }
Point normal(Point v) {
  double len = sqrt(dot(v, v));
  return Point(-v.y / len, v.x / len);
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  cin >> A.x >> A.y >> B.x >> B.y;
  cin >> n;
  Point C = (A + B) * 0.5;
  Point V = normal(A - B);
  Point p;
  double r, L, R;
  int left = 0;
  for (int i = 1; i <= n; ++i) {
    cin >> p.x >> p.y >> r;
    if (dot(V, p - C) > 0) {
      double low = -INF, high = INF;
      for (int j = 1; j <= 100; ++j) {
        double mid = (low + high) * 0.5;
        Point D = C + V * mid;
        if (sqrt(dot(A - D, A - D)) < sqrt(dot(p - D, p - D)) - r)
          low = mid;
        else
          high = mid;
      }
      L = (low + high) * 0.5;
      low = -INF, high = INF;
      for (int j = 1; j <= 100; ++j) {
        double mid = (low + high) * 0.5;
        Point D = C + V * mid;
        if (sqrt(dot(A - D, A - D)) < sqrt(dot(p - D, p - D)) + r)
          low = mid;
        else
          high = mid;
      }
      R = (low + high) * 0.5;
    } else {
      double low = -INF, high = INF;
      for (int j = 1; j <= 100; ++j) {
        double mid = (low + high) * 0.5;
        Point D = C + V * mid;
        if (sqrt(dot(A - D, A - D)) < sqrt(dot(p - D, p - D)) - r)
          high = mid;
        else
          low = mid;
      }
      R = (low + high) * 0.5;
      low = -INF, high = INF;
      for (int j = 1; j <= 100; ++j) {
        double mid = (low + high) * 0.5;
        Point D = C + V * mid;
        if (sqrt(dot(A - D, A - D)) < sqrt(dot(p - D, p - D)) + r)
          high = mid;
        else
          low = mid;
      }
      L = (low + high) * 0.5;
    }
    if (L < 0 && R > 0) left++;
    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 (!left) {
    cout << fixed << setprecision(8) << sqrt(dot(A - C, A - C)) << '\n';
  } else {
    double ans = INF;
    sort(vR.begin(), vR.end());
    int cnt = left;
    for (auto it : vR) {
      cnt += it.second;
      if (!cnt) {
        Point tmp = C + V * it.first - A;
        ans = min(ans, sqrt(dot(tmp, tmp)));
        break;
      }
    }
    sort(vL.begin(), vL.end());
    reverse(vL.begin(), vL.end());
    cnt = left;
    for (auto it : vL) {
      cnt += it.second;
      if (!cnt) {
        Point tmp = C + V * it.first - A;
        ans = min(ans, sqrt(dot(tmp, tmp)));
        break;
      }
    }
    cout << fixed << setprecision(8) << ans << '\n';
  }
  return 0;
}
