#include <bits/stdc++.h>
typedef struct point {
  double x;
  double y;
} point;
typedef struct segment {
  point a;
  point b;
} segment;
const double eps = 0.000000001;
const double inf = 10e25;
int eq(double a, double b) { return (fabs(a - b) < eps); }
double min(double a, double b) { return (a < b) ? a : b; }
double dist(point a, point b) {
  return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double point_seg_dist(point a, segment s) {
  double d1 = dist(a, s.a), d2 = dist(a, s.b), ans = min(d1, d2);
  if (eq(s.a.x, s.b.x)) {
    if ((a.y - s.a.y) * (a.y - s.b.y) < 0) {
      ans = min(ans, fabs(a.x - s.a.x));
    }
  }
  if (eq(s.a.y, s.b.y)) {
    if ((a.x - s.a.x) * (a.x - s.b.x) < 0) {
      ans = min(ans, fabs(a.y - s.a.y));
    }
  }
  return ans;
}
double seg_dist(segment p, segment q) {
  double d1 = min(point_seg_dist(p.a, q), point_seg_dist(p.b, q)),
         d2 = min(point_seg_dist(q.a, p), point_seg_dist(q.b, p));
  return min(d1, d2);
}
double g[1002][1002], d[1002];
int n, col[1002];
segment s[1002];
point A, B;
double a, b;
void add(int i, int j, double dist) {
  if (dist < a || eq(dist, a)) {
    if (i != (n + 1) && j != (n + 1)) {
      g[i][j] = g[j][i] = a + b;
    } else {
      g[i][j] = g[j][i] = dist;
    }
  } else {
    g[i][j] = g[j][i] = inf;
  }
}
void read_n(void) {
  scanf("%lf%lf", &a, &b);
  scanf("%lf%lf%lf%lf", &A.x, &A.y, &B.x, &B.y);
  scanf("%d", &n);
  int i, j;
  for (i = 0; i < n; ++i) {
    scanf("%lf%lf%lf%lf", &s[i].a.x, &s[i].a.y, &s[i].b.x, &s[i].b.y);
    add(i, (n), point_seg_dist(A, s[i]));
    add(i, (n + 1), point_seg_dist(B, s[i]));
  }
  for (i = 0; i < n; ++i) {
    for (j = i + 1; j < n; ++j) {
      add(i, j, seg_dist(s[i], s[j]));
    }
  }
  add((n), (n + 1), dist(A, B));
}
void dijkstra(void) {
  int i, mink;
  double mind;
  for (i = 0; i < n + 2; ++i) {
    col[i] = 0;
    d[i] = inf;
  }
  d[(n)] = 0.0;
  while (1) {
    mind = inf;
    mink = -1;
    for (i = 0; i < n + 2; ++i) {
      if (col[i] == 0 && d[i] < mind) {
        mind = d[i];
        mink = i;
      }
    }
    if (mink == -1) {
      break;
    }
    col[mink] = 1;
    for (i = 0; i < n + 2; ++i) {
      if (col[i] == 0 && d[i] > mind + g[mink][i]) {
        d[i] = mind + g[mink][i];
      }
    }
  }
  if (eq(d[(n + 1)], inf)) {
    printf("-1");
  } else {
    printf("%.10lf", d[(n + 1)]);
  }
}
int main(void) {
  read_n();
  dijkstra();
  return 0;
}
