#include <bits/stdc++.h>
using namespace std;
int nextInt() {
  int x;
  scanf("%d", &x);
  return x;
}
long long nextLong() {
  long long x;
  scanf("%I64d", &x);
  return x;
}
double nextDouble() {
  double x;
  scanf("%lf", &x);
  return x;
}
const int BUFSIZE = 1000000;
char buf[BUFSIZE + 1];
string nextString() {
  scanf("%s", buf);
  return buf;
}
string nextLine() {
  gets(buf);
  return buf;
}
int stringToInt(string s) {
  stringstream in(s);
  int x;
  in >> x;
  return x;
}
struct Point {
  double x, y;
  Point() : x(0), y(0) {}
  Point(double x, double y) : x(x), y(y) {}
  Point operator-(Point op) const { return Point(x - op.x, y - op.y); }
  Point operator+(Point op) const { return Point(x + op.x, y + op.y); }
  Point operator*(double op) const { return Point(x * op, y * op); }
  double operator*(Point op) const { return x * op.x + y * op.y; }
  double operator%(Point op) const { return x * op.y - y * op.x; }
  double length2() { return x * x + y * y; }
  double length() { return sqrt(length2()); }
};
Point nextPoint() {
  double x = nextDouble();
  double y = nextDouble();
  return Point(x, y);
}
double getDist(Point &p, pair<Point, Point> &seg) {
  Point &s = seg.first;
  Point &e = seg.second;
  if ((p - s) * (e - s) <= 0) {
    return (p - s).length2();
  }
  if ((p - e) * (s - e) <= 0) {
    return (p - e).length2();
  }
  double t = (p - s) * (e - s) / (e - s).length2();
  Point w = s + (e - s) * t;
  return (w - p).length2();
}
double getDist(pair<Point, Point> &seg1, pair<Point, Point> &seg2) {
  double d1 = min(getDist(seg1.first, seg2), getDist(seg1.second, seg2));
  double d2 = min(getDist(seg2.first, seg1), getDist(seg2.second, seg1));
  return sqrt(min(d1, d2));
}
const double EPS = 1e-9;
double roundUp(int a, int b, double x) {
  double k = ceil(x / (a + b) - EPS);
  return (a + b) * k;
}
void relax(vector<double> &dist, set<pair<double, int> > &q, int u, double d) {
  if (dist[u] <= d + EPS) {
    return;
  }
  set<pair<double, int> >::iterator it = q.find(make_pair(dist[u], u));
  if (it != q.end()) {
    q.erase(it);
  }
  dist[u] = d;
  q.insert(make_pair(dist[u], u));
}
int main() {
  int a = nextInt();
  int b = nextInt();
  vector<pair<Point, Point> > segs;
  Point source = nextPoint();
  segs.push_back(pair<Point, Point>(source, source));
  Point target = nextPoint();
  segs.push_back(pair<Point, Point>(target, target));
  int n = nextInt();
  for (int i = 0; i < n; ++i) {
    Point a = nextPoint();
    Point b = nextPoint();
    segs.push_back(pair<Point, Point>(a, b));
  }
  vector<vector<pair<int, double> > > adj(segs.size());
  for (int i = 0; i < segs.size(); ++i) {
    for (int j = i + 1; j < segs.size(); ++j) {
      double dist = getDist(segs[i], segs[j]);
      if (dist <= a + EPS) {
        adj[i].push_back(make_pair(j, dist));
        adj[j].push_back(make_pair(i, dist));
      }
    }
  }
  const double INF = 1e100;
  vector<double> dist(segs.size(), INF);
  set<pair<double, int> > q;
  q.insert(make_pair(0, 0));
  dist[0] = 0;
  while (!q.empty()) {
    int at = q.begin()->second;
    q.erase(q.begin());
    for (int i = 0; i < adj[at].size(); ++i) {
      int to = adj[at][i].first;
      double nDist = roundUp(a, b, dist[at]) + adj[at][i].second;
      relax(dist, q, to, nDist);
    }
  }
  if (dist[1] == INF) {
    printf("-1\n");
  } else {
    printf("%.10lf\n", dist[1]);
  }
  return 0;
}
