#include <bits/stdc++.h>
using namespace std;
const int maxint = -1u >> 1;
template <class T>
bool get_max(T& a, const T& b) {
  return b > a ? a = b, 1 : 0;
}
template <class T>
bool get_min(T& a, const T& b) {
  return b < a ? a = b, 1 : 0;
}
const double eps = 1e-8;
const double pi = acos(-1.0);
int sgn(double d) {
  if (d > eps) return 1;
  if (d < -eps) return -1;
  return 0;
}
struct point {
  double x, y, z;
  point(double _x = 0, double _y = 0, double _z = 0) : x(_x), y(_y), z(_z) {}
  void input() { scanf("%lf%lf%lf", &x, &y, &z); }
  double len() const { return sqrt(x * x + y * y + z * z); }
  point trunc(double l) const {
    double r = l / len();
    return point(x * r, y * r, z * r);
  }
  void output() const { printf("%.10lf %.10lf %.10lf\n", x, y, z); }
};
bool operator==(const point& p1, const point& p2) {
  return sgn(p1.x - p2.x) == 0 && sgn(p1.y - p2.y) == 0 &&
         sgn(p1.z - p2.z) == 0;
}
bool operator<(const point& p1, const point& p2) {
  return sgn(p1.x - p2.x) == 0
             ? (sgn(p1.y - p2.y) == 0 ? sgn(p1.z - p2.z) < 0 : p1.y < p2.y)
             : p1.x < p2.x;
}
bool operator>(const point& p1, const point& p2) {
  return sgn(p1.x - p2.x) == 0
             ? (sgn(p1.y - p2.y) == 0 ? sgn(p1.z - p2.z) > 0 : p1.y > p2.y)
             : p1.x > p2.x;
}
point operator+(const point& p1, const point& p2) {
  return point(p1.x + p2.x, p1.y + p2.y, p1.z + p2.z);
}
point operator-(const point& p1, const point& p2) {
  return point(p1.x - p2.x, p1.y - p2.y, p1.z - p2.z);
}
double operator^(const point& p1, const point& p2) {
  return p1.x * p2.x + p1.y * p2.y + p1.z * p2.z;
}
point operator*(const point& p1, const point& p2) {
  return point(p1.y * p2.z - p1.z * p2.y, p1.z * p2.x - p1.x * p2.z,
               p1.x * p2.y - p1.y * p2.x);
}
point operator*(const point& p, double r) {
  return point(p.x * r, p.y * r, p.z * r);
}
point operator/(const point& p, double r) {
  return point(p.x / r, p.y / r, p.z / r);
}
int n;
double vs, vp, T;
point p[10010], dst, p0;
bool solve();
bool compute();
bool can(double t, point p1, point p2);
int main() {
  while (solve())
    ;
  return 0;
}
bool solve() {
  if (scanf("%d", &n) == EOF) return false;
  for (int i = 0; i <= n; ++i) p[i].input();
  scanf("%lf%lf", &vp, &vs);
  p0.input();
  if (compute()) {
    puts("YES");
    printf("%.10lf\n", T);
    dst.output();
  } else {
    puts("NO");
  }
  return true;
}
bool compute() {
  double t = 0;
  for (int i = 0; i < n; ++i) {
    if (can(t, p[i], p[i + 1])) return true;
    t += (p[i + 1] - p[i]).len() / vs;
  }
  return false;
}
bool can(double t, point p1, point p2) {
  double lb = 0, ub = (p2 - p1).len();
  for (int i = 0; i < 300; ++i) {
    double mid = (lb + ub) / 2.0;
    point k = p1 + (p2 - p1).trunc(mid);
    double t1 = t + (k - p1).len() / vs;
    double t2 = (k - p0).len() / vp;
    if (t2 < t1)
      ub = mid;
    else
      lb = mid;
  }
  point k = p1 + (p2 - p1).trunc((lb + ub) / 2.0);
  double t1 = t + (k - p1).len() / vs;
  double t2 = (k - p0).len() / vp;
  if (sgn(t1 - t2) == 0) {
    T = t1;
    dst = k;
    return true;
  }
  return false;
}
