#include <bits/stdc++.h>
using namespace std;
int n, m, xc, yc, zc;
int f[305][305], a[305][305];
int main() {
  scanf("%d %d", &n, &m);
  memset(f, 127, sizeof(f));
  memset(a, 127, sizeof(a));
  for (int i = 1; i <= m; i++) {
    scanf("%d %d %d", &xc, &yc, &zc);
    f[xc][yc] = zc;
    f[yc][xc] = zc;
    a[xc][yc] = zc;
    a[yc][xc] = zc;
  }
  for (int i = 1; i <= n; i++) f[i][i] = 0;
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++)
        if ((f[i][k] != 2139062143) && (f[k][j] != 2139062143))
          f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
  double ans = 1e10, maxc;
  for (int i = 1; i <= n; i++) {
    maxc = 0;
    for (int j = 1; j <= n; j++) maxc = max(maxc, double(f[i][j]));
    ans = min(ans, maxc);
  }
  double ttj;
  int maxj[10005];
  pair<int, int> e[10005];
  for (int i = 1; i <= n; i++)
    for (int j = 1; j <= n; j++)
      if (a[i][j] != 2139062143) {
        for (int k = 1; k <= n; k++) e[k] = make_pair(f[k][i], f[k][j]);
        sort(e + 1, e + n + 1);
        maxj[n + 1] = 0;
        for (int k = n; k >= 1; k--) maxj[k] = max(maxj[k + 1], e[k].second);
        for (int k = 1; k <= n; k++) {
          ttj = double(e[k].first + maxj[k + 1] + a[i][j]) / 2;
          if ((ttj - e[k].first > 0) && (ttj - e[k].first < a[i][j]))
            ans = min(ans, double(e[k].first + maxj[k + 1] + a[i][j]) / 2);
          ans = min(ans, double(max(e[k].first, maxj[k + 1])) + a[i][j]);
        }
      }
  printf("%.20lf\n", ans);
  return 0;
}
