#include <bits/stdc++.h>
using namespace std;
struct Edge {
  int from;
  int to;
  double length;
  Edge(int f, int t, double l) : from(f), to(t), length(l) {}
};
struct Node {
  vector<int> out;
};
struct Graph {
  vector<Node> nodes;
  vector<Edge> edges;
  Graph(int nr_nodes, int nr_edges) {
    nodes.resize(nr_nodes);
    edges.reserve(nr_edges);
  }
  void add_edge(int from, int to, double length) {
    Edge e = Edge(from, to, length);
    edges.push_back(e);
    nodes[from].out.push_back(edges.size() - 1);
  }
  double Dijkstra() {
    set<pair<double, int> > q;
    vector<double> distances(nodes.size(), INFINITY);
    vector<int> used_edges(nodes.size(), -1);
    distances[0] = 0;
    q.insert(make_pair(0, 0));
    while (!q.empty()) {
      long d = q.begin()->first;
      int n = q.begin()->second;
      q.erase(q.begin());
      for (unsigned int i = 0; i < nodes[n].out.size(); i++) {
        Edge& e = edges[nodes[n].out[i]];
        if ((d + e.length) < distances[e.to]) {
          q.erase(make_pair(distances[e.to], e.to));
          distances[e.to] = d + e.length;
          used_edges[e.to] = nodes[n].out[i];
          q.insert(make_pair(distances[e.to], e.to));
        }
      }
    }
    return distances[nodes.size() - 1];
  }
  void print_all() {
    for (unsigned int i = 0; i < nodes.size(); i++) {
      Node n = nodes[i];
      cout << "Node " << i << " has edges to: ";
      for (unsigned int j = 0; j < n.out.size(); ++j) {
        cout << edges[n.out[j]].to << "(" << edges[n.out[j]].length << ")"
             << " ";
      }
      cout << endl;
    }
  }
};
double p2pdistance(int x1, int y1, int x2, int y2) {
  double distx = x1 - x2;
  double disty = y1 - y2;
  return sqrt(distx * distx + disty * disty);
}
struct Trench {
  int node_id;
  int x1, y1, x2, y2;
  bool horizontal;
  Trench(int nid, int x1p, int y1p, int x2p, int y2p)
      : node_id(nid),
        x1(min(x1p, x2p)),
        y1(min(y1p, y2p)),
        x2(max(x1p, x2p)),
        y2(max(y1p, y2p)),
        horizontal(y1p == y2p){};
  double distance(int x, int y) {
    double result = min(p2pdistance(x, y, x1, y1), p2pdistance(x, y, x2, y2));
    if (horizontal && (x1 <= x) && (x <= x2))
      result = min(result, fabs(y - y1));
    if (!horizontal && (y1 <= y) && (y <= y2))
      result = min(result, fabs(x - x1));
    return result;
  }
  double distance(Trench& t) {
    double result = INFINITY;
    result = min(result, p2pdistance(x1, y1, t.x1, t.y1));
    result = min(result, p2pdistance(x1, y1, t.x2, t.y2));
    result = min(result, p2pdistance(x2, y2, t.x1, t.y1));
    result = min(result, p2pdistance(x2, y2, t.x2, t.y2));
    if (horizontal && t.horizontal) {
      if (!((x1 > t.x2) || (x2 < t.x1))) result = min(result, fabs(y1 - t.y1));
    } else if (!horizontal && !t.horizontal) {
      if (!((y1 > t.y2) || (y2 < t.y1))) result = min(result, fabs(x1 - t.x1));
    } else {
      if (horizontal) {
        if ((t.y1 <= y1) && (y1 <= t.y2)) {
          result = min(result, fabs(x1 - t.x1));
          result = min(result, fabs(x2 - t.x1));
        }
        if ((x1 <= t.x1) && (t.x1 <= x2)) {
          result = min(result, fabs(y1 - t.y1));
          result = min(result, fabs(y1 - t.y2));
        }
      } else {
        result = min(result, t.distance(*this));
      }
    }
    return result;
  }
};
int main(void) {
  ios::sync_with_stdio(false);
  int a, b;
  cin >> a >> b;
  int startx, starty, endx, endy;
  cin >> startx >> starty >> endx >> endy;
  int n;
  cin >> n;
  vector<Trench> trenches;
  for (int i = 0; i < n; i++) {
    int x1, y1, x2, y2;
    cin >> x1 >> y1 >> x2 >> y2;
    trenches.push_back(Trench(i + 1, x1, y1, x2, y2));
  }
  if (p2pdistance(startx, starty, endx, endy) <= a) {
    cout << p2pdistance(startx, starty, endx, endy);
    cout << "\n";
    return 0;
  }
  Graph g(n + 2, (n + 2) * (n + 2));
  for (auto& trench1 : trenches) {
    if (trench1.distance(startx, starty) <= a) {
      g.add_edge(0, trench1.node_id, a + b);
    }
    if (trench1.distance(endx, endy) <= a) {
      g.add_edge(trench1.node_id, n + 1, trench1.distance(endx, endy));
    }
    for (auto& trench2 : trenches) {
      if (trench1.distance(trench2) <= a) {
        g.add_edge(trench1.node_id, trench2.node_id, a + b);
      }
    }
  }
  double time = g.Dijkstra();
  if (time == INFINITY)
    cout << -1;
  else {
    cout << fixed << setprecision(9);
    cout << time;
  }
  cout << "\n";
  return 0;
}
