#include <bits/stdc++.h>
using namespace std;
inline long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1ll;
  long long _tmp = mypow(_a, _x / 2, _mod);
  _tmp = (_tmp * _tmp) % _mod;
  if (_x & 1) _tmp = (_tmp * _a) % _mod;
  return _tmp;
}
inline long long add(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x + _y;
  if (_ >= _mod) _ -= _mod;
  return _;
}
inline long long sub(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x - _y;
  if (_ < 0) _ += _mod;
  return _;
}
inline long long mul(long long _x, long long _y,
                     long long _mod = 1000000007ll) {
  long long _ = _x * _y;
  if (_ >= _mod) _ %= _mod;
  return _;
}
inline bool equal(double _x, double _y) {
  return _x > _y - 1e-13 && _x < _y + 1e-13;
}
int __ = 1, cs;
vector<tuple<double, double, double> > v;
double sqr(const double& x) { return x * x; }
double dist(const tuple<double, double, double>& p1,
            const tuple<double, double, double>& p2) {
  return sqrt(sqr(get<0>(p1) - get<0>(p2)) + sqr(get<1>(p1) - get<1>(p2)) +
              sqr(get<2>(p1) - get<2>(p2)));
}
tuple<double, double, double> operator+(
    const tuple<double, double, double>& p1,
    const tuple<double, double, double>& p2) {
  return make_tuple(get<0>(p1) + get<0>(p2), get<1>(p1) + get<1>(p2),
                    get<2>(p1) + get<2>(p2));
}
tuple<double, double, double> operator-(
    const tuple<double, double, double>& p1,
    const tuple<double, double, double>& p2) {
  return make_tuple(get<0>(p1) - get<0>(p2), get<1>(p1) - get<1>(p2),
                    get<2>(p1) - get<2>(p2));
}
tuple<double, double, double> operator*(const tuple<double, double, double>& p1,
                                        const double& tk) {
  return make_tuple(get<0>(p1) * tk, get<1>(p1) * tk, get<2>(p1) * tk);
}
void scan(tuple<double, double, double>& tp) {
  double tx, ty, tz;
  scanf("%lf%lf%lf", &tx, &ty, &tz);
  tp = make_tuple(tx, ty, tz);
}
void build() {}
int n;
tuple<double, double, double> p[111111], s;
double vp, vs, sum;
void init() {
  n = getint() + 1;
  for (int i = 0; i < n; i++) {
    scan(p[i]);
    if (i) sum += dist(p[i - 1], p[i]);
  }
  scanf("%lf%lf", &vp, &vs);
  scan(s);
}
tuple<double, double, double> ans;
bool okay(double mid) {
  tuple<double, double, double> pos = p[0];
  double elp = 0.0;
  for (int i = 1; i < n; i++) {
    double tdist = dist(p[i - 1], p[i]);
    double tt = tdist / vs;
    if (elp + tt > mid) {
      double lft = mid - elp;
      pos = pos + (p[i] - p[i - 1]) * (lft / tt);
      break;
    } else {
      elp += tt;
      pos = p[i];
    }
  }
  double dlt = dist(s, pos);
  double ttt = dlt / vp;
  if (ttt > mid && !equal(ttt, mid)) return false;
  ans = pos;
  return true;
}
void solve() {
  double l = 0.0, r = sum / vs + 1e-13, mid;
  bool good = false;
  for (int i = 0; i < 200; i++) {
    mid = (l + r) * 0.5;
    if (okay(mid))
      r = mid, good = true;
    else
      l = mid;
  }
  if (!good)
    puts("NO");
  else {
    puts("YES");
    printf("%.12f\n", l);
    printf("%.12f %.12f %.12f\n", get<0>(ans), get<1>(ans), get<2>(ans));
  }
}
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
