#include <bits/stdc++.h>
using namespace std;
const int maxn = 200, maxm = 20000;
int d[maxn][maxn];
int edges[maxm][3];
pair<int, int> ps[maxn];
int main() {
  int n, m;
  while (scanf("%d%d", &n, &m) >= 1) {
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++) d[i][j] = (i == j) ? 0 : ((int)1E9);
    for (int i = 0; i < m; i++) {
      int s, t, w;
      scanf("%d%d%d", &s, &t, &w);
      --s, --t;
      w *= 2;
      d[s][t] = min(d[s][t], w);
      d[t][s] = min(d[t][s], w);
      edges[i][0] = s, edges[i][1] = t, edges[i][2] = w;
    }
    for (int k = 0; k < n; k++)
      for (int i = 0; i < n; i++)
        for (int j = 0; j < n; j++) d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
    int ans = ((int)1E9);
    for (int i = 0; i < n; i++) ans = min(ans, *max_element(d[i], d[i] + n));
    for (int it = 0; it < m; it++) {
      int v1 = edges[it][0], v2 = edges[it][1], w = edges[it][2];
      for (int i = 0; i < n; i++)
        ps[i] = make_pair((d[v2][i] + w - d[v1][i]) / 2,
                          (d[v2][i] + w + d[v1][i]) / 2);
      sort(ps, ps + n);
      int r = 0;
      for (int i = 0; i < n; i++) {
        if (r && (ps[i].first - ps[r - 1].first) <=
                     (ps[r - 1].second - ps[i].second))
          continue;
        while (r && (ps[i].first - ps[r - 1].first) <=
                        (ps[i].second - ps[r - 1].second))
          --r;
        ps[r++] = ps[i];
      }
      for (int i = 0; i < r - 1; i++)
        ans = min(ans, ps[i].second - (-ps[i].first + ps[i + 1].first +
                                       ps[i].second - ps[i + 1].second) /
                                          2);
    }
    printf("%.1lf\n", ans / 2.0);
  }
  return 0;
}
