#include <iostream>
#include <cstdio>
#include <math.h>
#include <cassert>

using namespace std;

const int maxn = 1 << 17;

struct pt {
  	int x, y;

	pt() {}
	pt(int x, int y) : x(x), y(y) {}
	
	void read() {
	 	cin >> x >> y;
	}

	pt operator- (const pt &p) {
	 	return pt(x - p.x, y - p.y);
	}

	long long operator* (const pt &p) {
	 	return 1LL * x * p.y - 1LL * p.x * y;
	}

	double d() {
	 	return sqrt(1.0 * x * x + 1.0 * y * y);
	}
};

int n;
pt a[maxn];
double dp[maxn];

int main() {
 	freopen("icebergs.in", "r", stdin);
	freopen("icebergs.out", "w", stdout);

	cin >> n;
	assert(n <= 2000);
	for (int i = 0; i < n; i++) a[i].read();

	for (int i = 1; i < n; i++) {
	 	dp[i] = 1e20;
	}
	dp[0] = 0;
	for (int i = 0; i < n; i++) {
	 	int mx = i;
		for (int j = i + 1; j < n; j++) {
			long long o = (a[mx] - a[i]) * (a[j] - a[i]);
			if (o < 0) continue;
			mx = j;
			 dp[j] = min(dp[j], max(dp[i], (a[j] - a[i]).d()));
		}
	}
	cout.precision(10);
	cout << fixed;
	cout << dp[n - 1] << endl;

	return 0;
}