#include <bits/stdc++.h>
using namespace std;
int f[210][210], n, m, max1, max2, max3, ans, now, a[210000], b[210000],
    c[210000], g[210], x[210], y[210], rk[210];
bool cmp(int a, int b) { return x[a] > x[b]; }
int main() {
  cin >> n >> m;
  memset(f, 21, sizeof(f));
  for (int i = 1; i <= m; ++i)
    cin >> a[i] >> b[i] >> c[i], f[a[i]][b[i]] = min(f[a[i]][b[i]], c[i]),
                                 f[b[i]][a[i]] = f[a[i]][b[i]];
  for (int i = 1; i <= n; ++i) f[i][i] = 0;
  for (int i = 1; i <= n; ++i)
    for (int j = 1; j <= n; ++j)
      for (int k = 1; k <= n; ++k)
        f[j][k] = min(f[j][k], f[j][i] + f[i][k]), f[k][j] = f[j][k];
  ans = 210000000;
  for (int i = 1; i <= n; ++i) rk[i] = i;
  for (int i = 1; i <= m; ++i) {
    for (int j = 1; j <= n; ++j) x[j] = f[a[i]][j], y[j] = f[b[i]][j];
    sort(rk + 1, rk + n + 1, cmp);
    now = 0;
    for (int j = 1; j <= n; ++j) {
      if (x[rk[j]] + c[i] >= now && now + c[i] >= x[rk[j]])
        ans = min(ans, x[rk[j]] + c[i] + now);
      else
        ans = min(ans, max(x[rk[j]], now) * 2);
      now = max(now, y[rk[j]]);
    }
  }
  printf("%.2lf\n", (double)(ans) / 2);
  return 0;
}
