#include <bits/stdc++.h>
using namespace std;
const double EPS = 1e-8;
inline int sgn(double x) { return x > EPS ? 1 : (x > -EPS ? 0 : -1); }
struct Point {
  double x, y;
  Point(double x = 0.0, double y = 0.0) : x(x), y(y) {}
  Point operator-(const Point& p) const { return Point(x - p.x, y - p.y); }
  Point operator*(const double k) const { return Point(x * k, y * k); }
  inline double operator*(const Point& p) const { return x * p.y - y * p.x; }
  double len() const { return hypot(x, y); }
  void read() { scanf("%lf%lf", &x, &y); }
};
inline double dis(const Point& lhs, const Point& rhs) {
  return hypot(lhs.x - rhs.x, lhs.y - rhs.y);
}
inline int decideSide(const Point& p1, const Point& p2, const Point& l1,
                      const Point& l2) {
  return sgn((l2 - l1) * (p1 - l1)) * sgn((l2 - l1) * (p2 - l1));
}
inline double disptoline(const Point& p, const Point& l1, const Point& l2) {
  return fabs((p - l1) * (l2 - l1)) / dis(l1, l2);
}
inline double disptoseg(const Point& p, const Point& l1, const Point& l2) {
  Point t(p.x - (l1.y - l2.y), p.y + (l1.x - l2.x));
  if (decideSide(l1, l2, p, t) > 0) {
    return min(dis(l1, p), dis(l2, p));
  } else {
    return disptoline(p, l1, l2);
  }
}
inline double dissegtoseg(const Point& a1, const Point& a2, const Point& b1,
                          const Point& b2) {
  return min(min(disptoseg(a1, b1, b2), disptoseg(a2, b1, b2)),
             min(disptoseg(b1, a1, a2), disptoseg(b2, a1, a2)));
}
struct Line {
  Point u, v;
};
int a, b, n, N, nA, nB;
Point pA, pB;
double e[1002][1002];
Line l[1000];
double gao() {
  vector<double> mind(N, 1e100);
  vector<double> reach(N, 1e100);
  vector<bool> visited(N, false);
  mind[nA] = reach[nA] = 0;
  for (int i = 0; i < N; ++i) {
    int idx = -1;
    for (int j = 0; j < N; ++j) {
      if (!visited[j]) {
        if (idx == -1 || mind[j] < mind[idx]) {
          idx = j;
        }
      }
    }
    if (idx == -1) {
      break;
    }
    visited[idx] = true;
    for (int j = 0; j < N; ++j) {
      if (!visited[j] && mind[idx] + e[idx][j] < reach[j]) {
        reach[j] = mind[idx] + e[idx][j];
        mind[j] = mind[idx] + a + b;
      }
    }
  }
  if (reach[nB] > 1e50) {
    return -1.0;
  }
  return reach[nB];
}
int main() {
  scanf("%d%d", &a, &b);
  pA.read();
  pB.read();
  scanf("%d", &n);
  for (int i = 0; i < n; ++i) {
    l[i].u.read();
    l[i].v.read();
  }
  N = n + 2;
  nA = n, nB = nA + 1;
  for (int i = 0; i < N; ++i) {
    for (int j = 0; j < N; ++j) {
      e[i][j] = 1e100;
    }
  }
  if ((pA - pB).len() < a + EPS) {
    e[nA][nB] = (pA - pB).len();
  }
  double t;
  for (int i = 0; i < n; ++i) {
    t = disptoseg(pA, l[i].u, l[i].v);
    t < a + EPS && (e[nA][i] = t);
    t = disptoseg(pB, l[i].u, l[i].v);
    t < a + EPS && (e[i][nB] = t);
    for (int j = i + 1; j < n; ++j) {
      t = dissegtoseg(l[i].u, l[i].v, l[j].u, l[j].v);
      t < a + EPS && (e[i][j] = e[j][i] = t);
    }
  }
  double res = gao();
  if (res < -EPS) {
    puts("-1");
  } else {
    printf("%.13f\n", res);
  }
  return 0;
}
