#!/usr/bin/python3

import math
n = int(input())
pts = [(0,0)] + [tuple(map(int, input().split())) for i in range(n)]
n += 1

def dist(pt1,pt2):
    return math.sqrt((pt1[0]-pt2[0])*(pt1[0]-pt2[0]) + (pt1[1]-pt2[1])*(pt1[1]-pt2[1]))


dsts = [[dist(a,b) for a in pts] for b in pts]
mxd = max(map(max,dsts))


class Graph:
    def __init__(self, graph):
        self.n = len(graph)
        self.graph = graph
        self.vis = [False for i in range(n)]
        self.is_cut = [False for i in range(n)]
        self.low = [0 for i in range(n)]
        self.tin = [0 for i in range(n)]

    def dfs(self,node,par,depth):
        self.vis[node] = True
        self.low[node] = depth
        self.tin[node] = depth
        for nxt in self.graph[node]:
            if nxt == par:
                continue
            if not self.vis[nxt]:
                self.dfs(nxt, node, depth + 1)
                self.low[node] = min(self.low[node], self.low[nxt])
                if self.low[nxt] >= depth and par != -1:
                    self.is_cut[node] = True
            else:
                self.low[node] = min(self.low[node], self.tin[nxt])

        # don't need to check if root is a cut point or not

lo = 0
hi = mxd
for i in range(100):
    mid = (lo+hi)/2
    graph = [[] for i in range(n)]
    for i in range(n):
        for j in range(n):
            if i != j and dsts[i][j] <= mid:
                graph[i].append(j)
    g = Graph(graph)
    g.dfs(0, -1, 0)
    if any(g.is_cut) or not all(g.vis):
        lo = mid
    else:
        hi = mid

print((lo+hi)/2)
