#include <bits/stdc++.h>
using namespace std;
const long double EPS = 1e-6;
complex<long double> A, B;
void read(complex<long double>& a) {
  long double x, y;
  cin >> x >> y;
  a = complex<long double>(x, y);
}
long double cross(const complex<long double>& a,
                  const complex<long double>& b) {
  return imag(conj(a) * b);
}
long double dot(const complex<long double>& a, const complex<long double>& b) {
  return real(conj(a) * b);
};
int ccw(complex<long double> a, complex<long double> b,
        complex<long double> c) {
  b -= a;
  c -= a;
  if (cross(b, c) > EPS) return +1;
  if (cross(b, c) < -EPS) return -1;
  if (dot(b, c) < -EPS) return +2;
  if (norm(b) < norm(c)) return -2;
  return 0;
}
struct Segment {
  complex<long double> A, B;
  complex<long double> projection(complex<long double> p) {
    long double t = dot(p - A, A - B) / norm(A - B);
    return A + t * (A - B);
  }
  bool intersect(Segment a) {
    if (ccw(A, B, a.A) < EPS && ccw(A, B, a.B) < EPS) {
      if (max(a.A.real(), a.B.real()) < min(A.real(), B.real()) ||
          max(A.real(), B.real()) < min(a.A.real(), a.B.real()))
        return false;
      if (max(a.A.imag(), a.B.imag()) < min(A.imag(), B.imag()) ||
          max(A.imag(), B.imag()) < min(a.A.imag(), a.B.imag()))
        return false;
      return true;
    }
    return ccw(A, B, a.A) * ccw(A, B, a.B) < EPS &&
           ccw(a.A, a.B, A) * ccw(a.A, a.B, B) < EPS;
  }
  bool intersect(complex<long double> p) {
    return abs(A - p) + abs(B - p) - abs(A - B) < EPS;
  }
  long double distance(complex<long double> p) {
    const complex<long double> r = projection(p);
    if (intersect(r)) return abs(r - p);
    return min(abs(A - p), abs(B - p));
  }
  long double distance(Segment a) {
    if (intersect(a)) return 0;
    return min(min(distance(a.A), distance(a.B)),
               min(a.distance(A), a.distance(B)));
  }
} x[1011];
long double a, b, f[1011];
int n;
bool mark[1011];
int main() {
  ios ::sync_with_stdio(false);
  while (cin >> a >> b) {
    read(A);
    read(B);
    cin >> n;
    for (int i = (1), _b = (n); i <= _b; i++) {
      read(x[i].A);
      read(x[i].B);
    }
    x[n + 1].A = x[n + 1].B = A;
    x[n + 2].A = x[n + 2].B = B;
    for (int i = (1), _b = (n + 2); i <= _b; i++) f[i] = 1e100;
    f[n + 1] = 0;
    memset(mark, false, sizeof mark);
    for (int turn = (1), _b = (n + 2); turn <= _b; turn++) {
      int u = -1;
      for (int i = (1), _b = (n + 2); i <= _b; i++)
        if (!mark[i])
          if (u == -1 || f[i] < f[u]) u = i;
      if (u < 0) break;
      mark[u] = true;
      for (int i = (1), _b = (n + 2); i <= _b; i++) {
        if (x[u].distance(x[i]) < a + EPS) {
          if (i == n + 2)
            f[i] = min(f[i], f[u] + x[u].distance(x[i]));
          else
            f[i] = min(f[i], f[u] + a + b);
        }
      }
    }
    if (f[n + 2] == 1e100)
      cout << -1 << endl;
    else
      cout << (fixed) << setprecision(10) << f[n + 2] << endl;
  }
  return 0;
}
