#include <bits/stdc++.h>
#pragma GCC optimize("Ofast,no-stack-protector,unroll-loops,fast-math")
#pragma GCC target( \
    "sse,sse2,sse3,ssse3,sse4.1,sse4.2,avx,avx2,popcnt,tune=native")
using namespace std;
namespace _c {
const double pi = acos(-1.0);
namespace min {
const int i8 = -128;
const int i16 = -32768;
const int i = -2147483647 - 1;
const long long l = -9223372036854775807LL - 1;
}  // namespace min
namespace max {
const int i8 = 127;
const int i16 = 32767;
const int i = 2147483647;
const long long l = 9223372036854775807LL;
}  // namespace max
}  // namespace _c
namespace _f {
template <typename T>
inline const T gcd(T m, T n) {
  while (n != 0) {
    T t = m % n;
    m = n;
    n = t;
  }
  return m;
}
template <typename T>
inline const T max(const T &a, const T &b) {
  return a > b ? a : b;
}
template <typename T>
inline const T min(const T &a, const T &b) {
  return a < b ? a : b;
}
template <typename T>
inline const T abs(const T &a) {
  return a > 0 ? a : -a;
}
template <typename T>
inline T pow(T a, T b) {
  T res = 1;
  while (b > 0) {
    if (b & 1) {
      res = res * a;
    }
    a = a * a;
    b >>= 1;
  }
  return res;
}
template <typename T>
inline T pow(T a, T b, const T &m) {
  a %= m;
  T res = 1;
  while (b > 0) {
    if (b & 1) {
      res = res * a % m;
    }
    a = a * a % m;
    b >>= 1;
  }
  return res % m;
}
}  // namespace _f
namespace io {
template <typename T>
inline void read(T &t) {
  register T res = 0, neg = 1;
  char g = getchar();
  for (; !isdigit(g); g = getchar()) {
    if (g == '-') {
      neg = -1;
    }
  }
  for (; isdigit(g); g = getchar()) {
    res = res * 10 + g - '0';
  }
  t = res * neg;
}
inline int in() {
  register int T;
  read(T);
  return T;
}
inline long long in_ll() {
  register long long T;
  read(T);
  return T;
}
}  // namespace io
struct rec {
  double x, y;
} a, b, c, d, e;
double t1, t2, l, r, lm, rm, eps = 1e-10;
double dist(rec a, rec b) {
  return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
rec point(double mid) {
  rec e;
  e.x = a.x + (d.x - a.x) * mid / dist(a, d),
  e.y = a.y + (d.y - a.y) * mid / dist(a, d);
  return e;
}
double calc(double mid, int k) {
  double l, r;
  mid /= dist(b, c);
  d.x = c.x + (b.x - c.x) * mid, d.y = c.y + (b.y - c.y) * mid;
  l = 0, r = dist(a, d);
  while (l + eps < r) {
    mid = (l + r) / 2;
    e = point(mid);
    if (dist(a, e) + dist(e, b) > t1 + eps ||
        dist(a, e) + dist(e, c) + dist(c, b) > t2 + eps)
      r = mid;
    else
      l = mid;
  }
  e = point(l);
  return dist(a, e) +
         min(t1 - dist(a, e) - dist(e, b),
             t2 - dist(a, e) - dist(e, c) - dist(c, b)) +
         dist(e, b) * (fabs(c.x - e.x) < eps && fabs(c.y - e.y) < eps);
}
int main() {
  cin >> t2 >> t1 >> a.x >> a.y >> b.x >> b.y >> c.x >> c.y;
  t1 += dist(a, b), t2 += dist(a, c) + dist(c, b);
  l = 0, r = dist(b, c);
  while (l + eps < r) {
    lm = l + (r - l) / 3, rm = r - (r - l) / 3;
    if (calc(lm, 0) < calc(rm, 0))
      l = lm;
    else
      r = rm;
  }
  printf("%.10f\n", max(calc(l, 1), calc(0, 1)));
  return 0;
}
