#include <bits/stdc++.h>

#define x first
#define y second
#define pb push_back
#define pii pair<int,int>
#define ll long long
#define FOR(i, a, b) for(int i = (int)(a); i < (int)(b); i++)
#define REP(i, a) FOR(i, 0, a)
#define TRACE(x) cout << #x << " = " << x << endl
#define _ << " _ " <<

using namespace std;

#define task "c"

struct Pt { double x, y; };

const int MAXN = 1010;

int N;
double va, vb;
Pt A[MAXN];
double dp[MAXN];

double sqr(double x) {
  return x * x;
}

double dist(Pt a, Pt b) {
  return sqrt(sqr(a.x - b.x) + sqr(a.y - b.y));
}

void popravi_naprijed(int i) {
  int j = i + 1;
  while (j < N && A[j].y > A[i].y) ++j;
  if (j == i + 1) return;
  if (j == N) return;
    
  double d = dist(A[j], A[j - 1]);
  double omj = (A[j-1].y - A[i].y) / (A[j-1].y - A[j].y);
  double dravno = A[j-1].x - A[i].x + (A[j].x - A[j-1].x) * omj;
    
  dp[j] = min(dp[j], dp[i] + (d * (1 - omj) / va) + dravno / vb);
}

void popravi_natrag(int i) {
  int j = i - 1;
  while (j >= 0 && A[j].y > A[i].y) --j;
  if (j == i - 1) return;
  if (j == -1) return;

  double d = dist(A[j], A[j + 1]);
  double omj = (A[j+1].y - A[i].y) / (A[j+1].y - A[j].y);
  double dravno = A[i].x - A[j+1].x + (A[j+1].x - A[j].x) * omj;
  
  dp[i] = min(dp[i], dp[j] + (d * (1 - omj) / va) + dravno / vb);
}

int main() {

  //freopen(task ".in", "r", stdin);
  //freopen(task ".out", "w", stdout);

  while (scanf("%d", &N) && N) {
    scanf("%lf%lf", &va, &vb);

    REP(i, N) scanf("%lf%lf", &A[i].x, &A[i].y);

    REP(i, N) dp[i] = 1e10;
    dp[0] = 0;
  
    REP(i, N) {
      popravi_natrag(i);
      dp[i + 1] = min(dp[i + 1], dp[i] + dist(A[i], A[i + 1]) / va);
      popravi_naprijed(i);
    }
  
    printf("%lf\n", dp[N-1]);
  }
  
  return 0;
}