#include <bits/stdc++.h>
using namespace std;
int ia, ib;
int stx, sty, edx, edy;
struct Point {
  int x, y;
  Point(int xx = 0, int yy = 0) : x(xx), y(yy) {}
};
struct Line {
  int x1, y1;
  int x2, y2;
} lineset[2222];
struct node {
  int u, v, next;
  double val;
} edge[4444444];
int e, head[2222];
bool vis[2222];
double dist[2222];
queue<int> que;
int ln;
void addedge(int u, int v, double val) {
  edge[e].u = u;
  edge[e].v = v;
  edge[e].val = val;
  edge[e].next = head[u];
  head[u] = e++;
}
int pointDist(Point pa, Point pb) {
  return (pa.x - pb.x) * (pa.x - pb.x) + (pa.y - pb.y) * (pa.y - pb.y);
}
int mindist(int id1, int id2) {
  if (lineset[id1].x1 == lineset[id1].x2 &&
      lineset[id2].y1 == lineset[id2].y2) {
    if ((lineset[id2].x1 - lineset[id1].x1) *
            (lineset[id2].x2 - lineset[id1].x1) <=
        0) {
      int tmp = min(abs(lineset[id1].y1 - lineset[id2].y1),
                    abs(lineset[id1].y2 - lineset[id2].y1));
      return tmp * tmp;
    }
    if ((lineset[id1].y1 - lineset[id2].y1) *
            (lineset[id1].y2 - lineset[id2].y1) <=
        0) {
      int tmp = min(abs(lineset[id1].x1 - lineset[id2].x1),
                    abs(lineset[id1].x1 - lineset[id2].x2));
      return tmp * tmp;
    }
  }
  Point pa1 = Point(lineset[id1].x1, lineset[id1].y1);
  Point pa2 = Point(lineset[id1].x2, lineset[id1].y2);
  Point pb1 = Point(lineset[id2].x1, lineset[id2].y1);
  Point pb2 = Point(lineset[id2].x2, lineset[id2].y2);
  int ret = pointDist(pa1, pb1);
  ret = min(ret, pointDist(pa1, pb2));
  ret = min(ret, pointDist(pa2, pb1));
  ret = min(ret, pointDist(pa2, pb2));
  return ret;
}
double spfa(int n) {
  int s = 0, t = n;
  for (int i = 0; i <= n; i++) dist[i] = 1e15;
  memset(vis, 0, sizeof(vis));
  dist[s] = 0;
  vis[s] = true;
  while (!que.empty()) que.pop();
  que.push(s);
  while (!que.empty()) {
    int v1 = que.front();
    que.pop();
    vis[v1] = false;
    for (int i = head[v1]; i != -1; i = edge[i].next) {
      int v2 = edge[i].v;
      if (dist[v1] + edge[i].val < dist[v2]) {
        dist[v2] = dist[v1] + edge[i].val;
        if (vis[v2] == false) {
          vis[v2] = true;
          que.push(v2);
        }
      }
    }
  }
  if (fabs(dist[t] - 1e15) < 1)
    return -1;
  else
    return dist[t];
}
int main() {
  cin >> ia >> ib;
  cin >> stx >> sty >> edx >> edy;
  cin >> ln;
  memset(head, -1, sizeof(head));
  e = 0;
  for (int i = 1; i <= ln; i++)
    cin >> lineset[i].x1 >> lineset[i].y1 >> lineset[i].x2 >> lineset[i].y2;
  lineset[0].x1 = lineset[0].x2 = stx;
  lineset[0].y1 = lineset[0].y2 = sty;
  lineset[2 * ln + 1].x1 = lineset[2 * ln + 1].x2 = edx;
  lineset[2 * ln + 1].y1 = lineset[2 * ln + 1].y2 = edy;
  for (int i = 1; i <= ln; i++) {
    for (int j = i + 1; j <= ln; j++) {
      int tdist = min(mindist(i, j), mindist(j, i));
      if (ia * ia >= tdist) {
        addedge(i + ln, j, ia);
        addedge(j + ln, i, ia);
      }
    }
    addedge(i, i + ln, ib);
    int tdist = min(mindist(0, i), mindist(i, 0));
    if (ia * ia >= tdist) addedge(0, i, ia);
    tdist = min(mindist(2 * ln + 1, i), mindist(i, 2 * ln + 1));
    if (ia * ia >= tdist) addedge(i + ln, 2 * ln + 1, sqrt((double)tdist));
  }
  int tdist = min(mindist(0, 2 * ln + 1), mindist(2 * ln + 1, 0));
  if (ia * ia >= tdist) addedge(0, 2 * ln + 1, sqrt((double)tdist));
  double ans = spfa(2 * ln + 1);
  if (ans < 0)
    printf("-1\n");
  else
    printf("%.6f\n", ans);
  return 0;
}
