#include <cmath>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1010, M = N * N, INF = 0x3f3f3f3f;
int n, m, k, p[N];
double x[N], y[N];
// WLP分成的列数0-N和信号塔个数
struct Edge
{
int a, b;
double e;
bool operator < (const Edge & E) const{
return e < E.e;
}
}edges[M];
double cal(int a, int b)
{
return sqrt((x[a] - x[b]) * (x[a] - x[b]) + (y[a] - y[b]) * (y[a] - y[b]));
}
int Find(int x)
{
if(x != p[x]) p[x] = Find(p[x]);
return p[x];
}
int main()
{
cin >> n >> m;
// n 是共有几列, m 是防御塔的个数
for(int i = 1; i <= m; i ++)
{
cin >> x[i] >> y[i];
}
for(int i = 0; i <= m + 1; i ++) p[i] = i;
for(int i = 1; i <= m; i ++)
{
for(int j = i + 1; j <= m; j ++)
{
edges[++ k] = {i, j, cal(i, j) / 2};
}
}
for(int i = 1; i <= m; i ++)
{
edges[++ k] = {0, i, (x[i] + 1)};
edges[++ k] = {m + 1, i, (n + 1 - x[i])};
}
sort(edges + 1, edges + 1 + k);
for(int i = 1; i <= k; i ++)
{
double e = edges[i].e;
int a = edges[i].a, b = edges[i].b;
int x = Find(a);
int y = Find(b);
if(x != y)
{
p[x] = y;
if(p[m + 1] == p[0])
{
printf("%.2lf\n", e);
break;
}
}
}
return 0;
}