#include <bits/stdc++.h>
struct point3 {
  double x, y, z;
};
point3 operator+(point3 a, point3 b) {
  point3 c;
  c.x = a.x + b.x, c.y = a.y + b.y, c.z = a.z + b.z;
  return c;
}
point3 operator-(point3 a, point3 b) {
  point3 c;
  c.x = a.x - b.x, c.y = a.y - b.y, c.z = a.z - b.z;
  return c;
}
point3 operator*(double b, point3 a) {
  point3 c;
  c.x = a.x * b, c.y = a.y * b, c.z = a.z * b;
  return c;
}
double operator*(point3 a, point3 b) {
  return a.x * b.x + a.y * b.y + a.z * b.z;
}
point3 operator%(point3 a, point3 b) {
  point3 c;
  c.x = a.y * b.z - a.z * b.y, c.y = a.z * b.x - a.x * b.z,
  c.z = a.x * b.y - a.y * b.x;
  return c;
}
double dis_point_line(point3 p, point3 m, point3 s, point3* res = NULL) {
  if (res != NULL) *res = m + (p - m) * s / (s * s) * s;
  return sqrt(((p - m) % s) * ((p - m) % s)) / sqrt(s * s);
}
double dis_point_face(point3 p, point3 m, point3 n, point3* res = NULL) {
  if (res != NULL) *res = p - (p - m) * n / (n * n) * n;
  return fabs((p - m) * n) / sqrt(n * n);
}
double dis_line_line(point3 m1, point3 s1, point3 m2, point3 s2,
                     point3* res1 = NULL, point3* res2 = NULL) {
  point3 n = s1 % s2, m2_;
  double d = dis_point_face(m2, m1, n, &m2_);
  if (res1 != NULL) *res1 = ((m2_ - m1) % s2) * n / (n * n) * s1 + m1;
  if (res2 != NULL) *res2 = ((m2_ - m1) % s1) * n / (n * n) * s2 + m2;
  return d;
}
point3 p, v, q[100], c[1000], s[1000];
double R, r[100];
int n, m;
int main() {
  scanf("%lf%lf%lf%lf%lf%lf%lf%d", &p.x, &p.y, &p.z, &v.x, &v.y, &v.z, &R, &n);
  for (int i = 0; i < n; i++) {
    int t;
    scanf("%lf%lf%lf%lf%d", &q[i].x, &q[i].y, &q[i].z, &r[i], &t);
    for (int j = 0; j < t; j++, c[m++] = q[i])
      scanf("%lf%lf%lf", &s[m].x, &s[m].y, &s[m].z);
  }
  double ans = 1e30;
  for (int i = 0; i < n; i++) {
    point3 tmp;
    double d = dis_point_line(q[i], p, v, &tmp);
    if (d < r[i] + R + 1e-8 && (tmp - p) * v > 1e-8) {
      if (fabs(r[i] + R - d) < 1e-8)
        d = (tmp - p) * v / (v * v);
      else
        d = (tmp - p) * v / (v * v) -
            sqrt((r[i] + R) * (r[i] + R) - d * d + 1e-10) / sqrt(v * v);
      if (d < ans) ans = d;
    }
  }
  for (int i = 0; i < m; i++) {
    point3 tmp, tmp1, tmp2;
    double d = dis_point_line(c[i], p, v, &tmp);
    if (d < R + 1e-8 && (tmp - p) * v > 1e-8) {
      if (fabs(d - R) < 1e-8)
        d = (tmp - p) * v / (v * v);
      else
        d = (tmp - p) * v / (v * v) - sqrt(R * R - d * d) / sqrt(v * v);
      if (d < ans) ans = d;
    }
    d = dis_point_line(c[i] + s[i], p, v, &tmp);
    if (d < R + 1e-8 && (tmp - p) * v > 1e-8) {
      if (fabs(d - R) < 1e-8)
        d = (tmp - p) * v / (v * v);
      else
        d = (tmp - p) * v / (v * v) - sqrt(R * R - d * d) / sqrt(v * v);
      if (d < ans) ans = d;
    }
    if ((v % s[i]) * (v % s[i]) > 1e-10) {
      d = dis_line_line(p, v, c[i], s[i], &tmp1, &tmp2);
      if (d < R + 1e-8 && (tmp1 - p) * v > 1e-8) {
        double t = 0;
        if (fabs(d - R) > 1e-8)
          t = sqrt(R * R - d * d) * sqrt(s[i] * s[i]) /
              sqrt((v % s[i]) * (v % s[i]));
        tmp2 = tmp2 - t * v * s[i] / (s[i] * s[i]) * s[i];
        if ((tmp2 - c[i]) * s[i] > -1e-8 &&
            (tmp2 - c[i]) * s[i] < s[i] * s[i] + 1e-8) {
          t = (tmp1 - p) * v / (v * v) - t;
        }
      }
    }
  }
  if (ans < 1e10)
    printf("%.8lf\n", ans);
  else
    puts("-1");
  return 0;
}
