#include <bits/stdc++.h>
using namespace std;
const long double eps = 1e-12;
struct point {
  long double x, y;
  point(long double x, long double y) : x(x), y(y) {}
  point operator-(point oth) { return point(x - oth.x, y - oth.y); }
  point operator+(point oth) { return point(oth.x + x, oth.y + y); }
  long double operator*(point oth) { return x * oth.x + y * oth.y; }
  point operator*(long double k) { return point(x * k, y * k); }
  static long double len(point a) { return sqrt(a * a); }
  point rotate(long double ang) {
    return point(x * cos(ang) - y * sin(ang), x * sin(ang) + y * cos(ang));
  }
};
struct circle {
  point cen;
  long double rad;
  circle(point cen, long double rad) : cen(cen), rad(max(rad, eps)) {}
  vector<point> cross(circle oth) {
    long double diff = point::len(oth.cen - cen);
    if (abs(diff - oth.rad - rad) < eps) {
      return {cen + (oth.cen - cen) * (rad / diff)};
    }
    if (diff > rad + oth.rad) return vector<point>();
    if (diff + oth.rad < rad) return vector<point>();
    if (diff + rad < oth.rad) return vector<point>();
    long double angle =
        acos((rad * rad + diff * diff - oth.rad * oth.rad) / (2 * rad * diff));
    point dir = (oth.cen - cen) * (1.0 / diff);
    return {point(cen + dir.rotate(angle) * rad),
            point(cen + dir.rotate(-angle) * rad)};
  }
  bool inside(point a) { return point::len(cen - a) < rad + eps; }
};
long double tol1, tol2;
int len1, len2;
vector<point> a;
bool check(long double mid) {
  vector<circle> b = {circle(a[0], mid), circle(a[1], tol1 - mid),
                      circle(a[2], tol2 - mid)};
  vector<point> imp;
  for (int i = 0; i < 3; i++) {
    for (int j = i + 1; j < 3; j++) {
      for (auto dat : b[i].cross(b[j])) {
        imp.push_back(dat);
      }
    }
    imp.push_back(a[i]);
  }
  for (auto can : imp) {
    bool okay = 1;
    for (auto i : b) okay &= i.inside(can);
    if (okay) return 1;
  }
  return 0;
}
long double solve() {
  long double goodfr = point::len(a[2] - a[0]) + point::len(a[1] - a[2]);
  if (tol1 >= goodfr) {
    return min(tol1, goodfr + len2);
  }
  long double L = 0, R = min(tol1, tol2);
  for (int i = 1; i <= 1000; i++) {
    long double mid = (L + R) / 2;
    if (check(mid))
      L = mid;
    else
      R = mid;
  }
  return L;
}
int main() {
  cin >> len2 >> len1;
  for (int i = 0; i < 3; i++) {
    int x, y;
    cin >> x >> y;
    a.push_back(point(x, y));
  }
  tol1 = point::len(a[1] - a[0]) + len1;
  tol2 = point::len(a[2] - a[0]) + len2;
  long double L = solve();
  printf("%.9Lf", L);
}
