#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1);
struct Point {
  double x, y;
};
inline Point operator+(const Point &a, const Point &b) {
  return {a.x + b.x, a.y + b.y};
}
inline Point operator-(const Point &a, const Point &b) {
  return {a.x - b.x, a.y - b.y};
}
inline Point operator*(const Point &a, double b) { return {a.x * b, a.y * b}; }
inline Point operator/(const Point &a, double b) { return {a.x / b, a.y / b}; }
inline double cross(const Point &a, const Point &b) {
  return a.x * b.y - a.y * b.x;
}
inline double dot(const Point &a, const Point &b) {
  return a.x * b.x + a.y * b.y;
}
inline double dis(const Point &a) { return sqrt(dot(a, a)); }
inline double angle(const Point &a, const Point &b) {
  return acos(dot(a, b) / dis(a) / dis(b));
}
inline double polar(const Point &a) { return atan2(a.y, a.x); }
inline double slope(const Point &a, const Point &b) {
  return (b.y - a.y) / (b.x - a.x);
}
using pdd = pair<double, double>;
const int N = 55;
void chkbad(double a, double b, double c, double l, double r,
            vector<pdd> &ret) {
  if (a > 0) {
    b /= a;
    c /= a;
    a = 1;
    if (b * b < 4 * a * c) return;
    double delta = sqrt(b * b - 4 * a * c), l0 = (-b - delta) / 2,
           r0 = (-b + delta) / 2;
    l0 = max(l0, l);
    r0 = min(r0, r);
    if (l0 < r0) ret.push_back({l0, r0});
  }
  if (a < 0) {
    double s = sqrt(a * a + b * b + c * c);
    a /= s;
    b /= s;
    c /= s;
    if (b * b < 4 * a * c) return ret.push_back({l, r});
    double delta = sqrt(b * b - 4 * a * c), l0 = (-b + delta) / (2 * a),
           r0 = (-b - delta) / (2 * a);
    if (-0.01 < a) {
      if (b > 0)
        l0 = (-2 * c) / (b + delta);
      else
        r0 = (2 * c) / (-b + delta);
    }
    if (l < l0) ret.push_back({l, min(l0, r)});
    if (r0 < r) ret.push_back({max(l, r0), r});
  }
}
void chkbad(double a, double b, double c, double d, double l0, double r0,
            double l1, double r1, vector<pdd> &ret) {
  double lmin = (-2 * r1 - c) / a, rmin = (-2 * l1 - c) / a;
  lmin = max(lmin, l0), rmin = min(rmin, r0);
  if (lmin < rmin)
    chkbad(1 - a * a / 4, b - a * c / 2, d - c * c / 4, lmin, rmin, ret);
  chkbad(1, a * l1 + b, l1 * l1 + c * l1 + d, l0, r0, ret);
  chkbad(1, a * r1 + b, r1 * r1 + c * r1 + d, l0, r0, ret);
}
void chkok(Point a, Point b, Point c, Point d, double v, double l,
           vector<pdd> &ret) {
  double la = 0, ra = dis(b - a), lc = 0, rc = dis(d - c);
  Point da = (b - a) / ra, dc = (d - c) / rc;
  if (v >= sqrt(2 / (1 + dot(da, dc)))) return;
  double c1 = v * v - 1, c2 = (2 * (1 - (v * v) * dot(da, dc))) / c1,
         c3 = (2 * v * v * dot(a - c, da) + 2 * l) / c1,
         c4 = (-2 * v * v * dot(a - c, dc) - 2 * l) / c1,
         c5 = (v * v * dot(a - c, a - c) - l * l) / c1;
  chkbad(c2, c3, c4, c5, la, ra, lc, rc, ret);
}
Point p[N];
double pre[N];
const double EPS = 1e-9;
int main() {
  ios::sync_with_stdio(false);
  int n;
  cin >> n;
  for (int i = 0; i <= n; i++) cin >> p[i].x >> p[i].y;
  for (int i = 1; i < n; i++) pre[i] = pre[i - 1] + dis(p[i] - p[i - 1]);
  if (n <= 2) {
    cout << 1 << endl;
    return 0;
  }
  double l = 1, r = 30;
  while (r - l > EPS) {
    bool fl = 0;
    double mid = (l + r) / 2;
    for (int i = 1; i < n - 1; i++) {
      vector<pdd> v1, v2;
      for (int j = 0; j < i; j++)
        chkok(p[i], p[i + 1], p[j], p[j + 1], mid, pre[j] - pre[i], v1);
      for (int j = i + 1; j < n; j++)
        chkok(p[i], p[i + 1], p[j], p[j + 1], mid, pre[j] - pre[i], v2);
      for (auto &j : v1)
        for (auto &k : v2)
          fl |= max(j.first, k.first) < min(j.second, k.second);
    }
    if (fl)
      l = mid;
    else
      r = mid;
  }
  printf("%.10lf\n", l);
  return 0;
}
