#include<iostream>
#include<complex>
#include<vector>
#include<cmath>
#include<algorithm>
#include<cstdio>
#include<queue>

using namespace std;

#define rep(i, n) for (int i = 0; i < int(n); ++i)

#define X real()
#define Y imag()
typedef complex<double> P;
typedef pair<P, P> L;
typedef vector<P> Pol;
const double INF = 1e40;
const double EPS = 1e-8;
const double PI = acos(-1);
int sig(double r) {return (r < -EPS) ? -1 : (r > EPS) ? 1: 0;}
bool eq(double a, double b) {return abs(a - b) < EPS;}
bool near(P a, P b) {return abs(b - a) < EPS;}
ostream &operator<<(ostream &os, const L &a) {
  os << a.first << "-" << a.second;
  return os;
}
double sq(double a) {return a * a;}
namespace std{
  bool operator<(const P &a, const P &b){
    if(!eq(a.X, b.X)) return a.X < b.X;
    if(!eq(a.Y, b.Y)) return a.Y < b.Y;
    return false;
  }
}
double dot(P a, P b) {return a.X * b.X + a.Y * b.Y;}
double cross(P a, P b) {return a.X * b.Y - a.Y * b.X;}
enum CCW{FRONT = 1, RIGHT = 2, BACK = 4, LEFT = 8, ON = 16};
int ccw(const P a, P b, P x) {
  b -= a;
  x -= a;
  double cr = cross(b, x);
  if (eq(cr, 0)) {
    if (sig(dot(b, x)) < 0) return BACK;
    if (sig(abs(b) - abs(x)) < 0) return FRONT;
    return ON;
  }
  return cr > 0 ? LEFT : RIGHT;
}
P vec(L a) {return a.second - a.first;}
double arg(P a, P b) {return acos(dot(a, b) / (abs(a) * abs(b)));}
P polar(double r, double theta) {return P(r * cos(theta), r * sin(theta));}
P rot(P p, double theta) { return p * polar(1, theta);}
P pLL(L a, L b) {
  P va = vec(a);
  P vb = vec(b);
  return a.first + va * (cross(vb, b.first - a.first) / cross(vb, va));
}

double tg, tw;
double dis[500][500];
P point[500];
double res[500];

pair<P, P> snell(L l, P p) {
  P p1 = pLL(l, L(p, p + polar(1, arg(vec(l)) + (PI / 2 - asin(tg / tw)))));
  P p2 = pLL(l, L(p, p + polar(1, arg(vec(l)) - (PI / 2 - asin(tg / tw)))));
  return make_pair(p1, p2);
}

int main() {
  int n;
  for (;;) {
    cin >> n;
    if (n == 0) break;
    rep (i, 500) rep (j, 500) dis[i][i] = INF;
    rep (i, 500) res[i] = INF;
    rep (i, n) cin >> point[i].X >> point[i].Y;
    cin >> tg >> tw >> point[n].X >> point[n].Y >> point[n + 1].X >> point[n + 1].Y;
    int count = n + 2;
    rep (i, n) rep (j, n + 2){
      pair<P, P> pp = snell(L(point[i], point[(i + 1) % n]), point[j]);
      point[count++] = pp.first;
      point[count++] = pp.second;
    }
    rep (i, count) rep (j, count) dis[i][j] = abs(point[i] - point[j]) * tw;
    rep (i, n) {
      rep (j, count) {
	if (ccw(point[i], point[(i + 1) % n], point[j]) != ON) continue;
	rep (k, count) {
	  if (ccw(point[i], point[(i + 1) % n], point[k]) != ON) continue;
	  dis[j][k] = abs(point[j] - point[k]) * tg;
	}
      }
    }
    priority_queue<pair<double, int>, vector<pair<double, int> >, greater<pair<double, int> > > que;
    que.push(make_pair(0, n));
    while (!que.empty()) {
      pair<double, int> now = que.top();
      que.pop();
      if (res[now.second] <= now.first) continue;
      res[now.second] = now.first;
      rep (i, count) if (i != now.second) {
	que.push(make_pair(now.first + dis[now.second][i], i));
      }
    }
    printf("%.12lf\n", res[n + 1]);
  }
}

Measured memory_bytes: 3748