#include <bits/stdc++.h>
using namespace std;
const int N = 300003;
int tree[4 * N];
struct point {
  int x, y, z;
  point() {}
  point(int _x, int _y, int _z) { x = _x, y = _y, z = _z; }
};
int main() {
  int n, vp, vs, px, py, pz;
  scanf("%d", &n);
  vector<point> pts(n + 1);
  for (int i = 0; i <= n; i++) scanf("%d%d%d", &pts[i].x, &pts[i].y, &pts[i].z);
  scanf("%d%d%d%d%d", &vp, &vs, &px, &py, &pz);
  long double passed = 0;
  for (int i = 0; i < n; i++) {
    point curr = pts[i];
    point nxt = pts[i + 1];
    int dx = curr.x - nxt.x;
    dx *= dx;
    int dy = curr.y - nxt.y;
    dy *= dy;
    int dz = curr.z - nxt.z;
    dz *= dz;
    long double dist = sqrt(dx + dy + dz);
    long double time = dist / vs;
    long double l = 0, r = time;
    int iter = 100;
    while (iter--) {
      long double mid = (l + r) / 2;
      long double newX = curr.x + (nxt.x - curr.x) * mid / time;
      long double newY = curr.y + (nxt.y - curr.y) * mid / time;
      long double newZ = curr.z + (nxt.z - curr.z) * mid / time;
      long double newDX = newX - px;
      newDX *= newDX;
      long double newDY = newY - py;
      newDY *= newDY;
      long double newDZ = newZ - pz;
      newDZ *= newDZ;
      long double newDist = sqrt(newDX + newDY + newDZ);
      long double newTime = newDist / vp;
      long double totalTime = mid + passed;
      if (abs(newTime - totalTime) <= 1e-10) {
        printf("YES\n");
        printf("%0.8LG\n", totalTime);
        printf("%0.8LG %0.8LG %0.8LG", newX, newY, newZ);
        return 0;
      } else {
        if (totalTime < newTime) {
          l = mid;
        } else {
          r = mid;
        }
      }
    }
    passed += time;
  }
  printf("NO");
  return 0;
}
