#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
const double eps = 1e-6;
int sgn(double x) { return x > eps ? 1 : x < -eps ? -1 : 0; }
struct pt {
  double x, y, z;
  pt() {}
  pt(double _x, double _y, double _z) : x(_x), y(_y), z(_z) {}
  pt operator-(const pt& a) const { return pt(x - a.x, y - a.y, z - a.z); }
  pt operator+(const pt& a) const { return pt(x + a.x, y + a.y, z + a.z); }
  pt operator*(const double a) const { return pt(x * a, y * a, z * a); }
  void read() { scanf("%lf%lf%lf", &x, &y, &z); }
  double len() { return sqrt(x * x + y * y + z * z); }
  void write() { printf("(%.2f %.2f %.2f)\n", x, y, z); }
  pt unit() {
    double l = len();
    return pt(x / l, y / l, z / l);
  }
  pt trunc(double s) {
    double l = len();
    return pt(x * s / l, y * s / l, z * s / l);
  }
};
double sqr(double x) { return x * x; }
pt det(pt a, pt b) {
  return pt(a.y * b.z - a.z * b.y, a.z * b.x - a.x * b.z,
            a.x * b.y - a.y * b.x);
}
double dot(pt a, pt b) { return a.x * b.x + a.y * b.y + a.z * b.z; }
double dis2(pt a, pt b) {
  return sqr(a.x - b.x) + sqr(a.y - b.y) + sqr(a.z - b.z);
}
double dis(pt a, pt b) { return sqrt(dis2(a, b)); }
void Assert(int x) {
  if (!x)
    while (1) puts("omg");
}
const int V = 110;
pt center, dir;
pt sphere[V];
double r[V];
vector<pt> p[V];
double R;
int n;
double ans;
double dis_to_line(pt o, pt a, pt b) {
  if (sgn(dot(o - a, b - a)) < 0) return dis(o, a);
  return det(o - a, o - b).len() / dis(a, b);
}
pt cross_point(pt a, pt b, pt c, pt d) {
  Assert(sgn(det(c - a, c - b).len() + det(d - a, d - b).len()) != 0);
  pt norm = det(c - a, c - b).unit();
  Assert(sgn(dot(d - a, norm)) == 0);
  double ratio =
      det(c - a, c - b).len() / (det(c - a, c - b) + det(d - b, d - a)).len();
  return c + (d - c) * ratio;
}
void intersect_sphere_line(pt o, double r, pt a, pt b) {
  double d = dis_to_line(o, a, b);
  if (sgn(d - r) > 0) return;
  pt c1;
  if (sgn(det(o - a, b - a).len()) == 0) {
    c1 = o - (b - a).trunc(r);
    ans = min(ans, dis(a, c1));
    return;
  }
  pt norm = det(o - a, b - a).unit();
  pt per = det(norm, b - a).unit();
  pt mid = cross_point(a, b, o, o + per);
  if (sgn(det(mid - a, mid - b).len()) != 0) {
    det(mid - a, mid - b).write();
  }
  d = sqrt(r * r - dis2(o, mid));
  c1 = mid - (b - a).trunc(d);
  if (sgn(dis(c1, o) - r) != 0) {
    Assert(0);
  }
  if (sgn(det(c1 - a, c1 - b).len()) != 0) {
    Assert(0);
  }
  ans = min(ans, dis(a, c1));
}
void solve(int id) {
  pt o = sphere[id];
  intersect_sphere_line(o, R + r[id], center, center + dir.unit());
  for (int i = 0; i < p[id].size(); ++i)
    intersect_sphere_line(o + p[id][i], R, center, center + dir.unit());
}
int main() {
  int tmp;
  center.read();
  dir.read();
  cin >> R;
  cin >> n;
  for (int i = 0; i < n; ++i) {
    sphere[i].read();
    scanf("%lf%d", &r[i], &tmp);
    p[i].resize(tmp);
    for (int j = 0; j < tmp; ++j) p[i][j].read();
  }
  ans = 1e10;
  for (int i = 0; i < n; ++i) solve(i);
  if (ans == 1e10)
    printf("-1\n");
  else
    printf("%.10f\n", ans / dir.len());
}
