#include <bits/stdc++.h>
using namespace std;
struct Point {
  double x, y;
  Point() { x = y = 0; }
  Point(double _x, double _y) { x = _x, y = _y; }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator/(double c) { return Point(x / c, y / c); }
} P[55];
double operator*(Point A, Point B) { return A.x * B.x + A.y * B.y; }
double Length(Point A) { return sqrt(A * A); }
void Check2(double a, double b, double c, double l, double r,
            vector<pair<double, double> > &ans) {
  if (a > 0) {
    b /= a, c /= a, a = 1;
    if (b * b < 4 * a * c) return;
    double d = sqrt(b * b - 4 * a * c);
    double l0 = (-b - d) / (2 * a), r0 = (-b + d) / (2 * a);
    l0 = max(l0, l), r0 = min(r0, r);
    if (l0 < r0) ans.push_back(make_pair(l0, r0));
    return;
  }
  if (a < 0) {
    double s = sqrt(a * a + b * b + c * c);
    a /= s, b /= s, c /= s;
    if (b * b < 4 * a * c) {
      ans.push_back(make_pair(l, r));
      return;
    }
    double d = sqrt(b * b - 4 * a * c);
    double l0 = (-b + d) / (2 * a), r0 = (-b - d) / (2 * a);
    if (a > -0.01) {
      if (b > 0)
        l0 = (-2 * c) / (b + d);
      else
        r0 = (2 * c) / (-b + d);
    }
    if (l < l0) ans.push_back(make_pair(l, min(l0, r)));
    if (r0 < r) ans.push_back(make_pair(max(l, r0), r));
  }
}
void Check1(double a, double b, double c, double d, double l0, double r0,
            double l1, double r1, vector<pair<double, double> > &ans) {
  double lmin = (-2 * r1 - c) / a, rmin = (-2 * l1 - c) / a;
  lmin = max(lmin, l0), rmin = min(rmin, r0);
  if (lmin < rmin)
    Check2(1 - a * a / 4, b - a * c / 2, d - c * c / 4, lmin, rmin, ans);
  Check2(1, a * l1 + b, l1 * l1 + c * l1 + d, l0, r0, ans);
  Check2(1, a * r1 + b, r1 * r1 + c * r1 + d, l0, r0, ans);
}
void Find(Point A, Point B, Point C, Point D, double v, double l,
          vector<pair<double, double> > &ans) {
  double lA = 0, rA = Length(B - A), lC = 0, rC = Length(D - C);
  Point dA = (B - A) / rA, dC = (D - C) / rC;
  if (v >= sqrt(2 / (1 + dA * dC))) return;
  double c1 = v * v - 1;
  double c2 = (2 * (1 - (v * v) * (dA * dC))) / c1;
  double c3 = (2 * v * v * ((A - C) * dA) + 2 * l) / c1;
  double c4 = (-2 * v * v * ((A - C) * dC) - 2 * l) / c1;
  double c5 = (v * v * ((A - C) * (A - C)) - l * l) / c1;
  Check1(c2, c3, c4, c5, lA, rA, lC, rC, ans);
}
bool Check(pair<double, double> I1, pair<double, double> I2) {
  return max(I1.first, I2.first) < min(I1.second, I2.second);
}
double pre[55];
int n, T = 50;
int main() {
  scanf("%d", &n);
  for (int i = 0; i <= n; i++) scanf("%lf%lf", &P[i].x, &P[i].y);
  for (int i = 1; i < n; i++) pre[i] = pre[i - 1] + Length(P[i] - P[i - 1]);
  if (n <= 2) {
    puts("1");
    return 0;
  }
  double l = 1.0, r = 30.0;
  while (T--) {
    bool flg = 0;
    double mid = (l + r) / 2;
    for (int i = 1; i < n - 1; i++) {
      vector<pair<double, double> > A, B;
      for (int j = 0; j < i; j++)
        Find(P[i], P[i + 1], P[j], P[j + 1], mid, pre[j] - pre[i], A);
      for (int j = i + 1; j < n; j++)
        Find(P[i], P[i + 1], P[j], P[j + 1], mid, pre[j] - pre[i], B);
      for (int j = 0; j < (int)A.size(); j++)
        for (int k = 0; k < (int)B.size(); k++) flg |= Check(A[j], B[k]);
    }
    if (flg)
      l = mid;
    else
      r = mid;
  }
  printf("%.10lf\n", l);
}
