#include <bits/stdc++.h>
using namespace std;
const int INF = (1 << 30) - 1;
int main() {
  int n, m;
  while (scanf("%d%d", &n, &m) > 0) {
    vector<vector<int>> dist(n + 1, vector<int>(n + 1, INF));
    for (int i = 1; i <= n; i++) dist[i][i] = 0;
    vector<tuple<int, int, int>> E(m);
    for (int i = 0; i < m; i++) {
      int u, v, w;
      scanf("%d%d%d", &u, &v, &w);
      w <<= 1;
      dist[u][v] = dist[v][u] = min(dist[u][v], w);
      E[i] = {u, v, w};
    }
    for (int k = 1; k <= n; k++) {
      for (int i = 1; i <= n; i++) {
        for (int j = 1; j <= n; j++) {
          dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]);
        }
      }
    }
    int min_diam = INF;
    for (int u = 1; u <= n; u++) {
      int max_dist_u = 0;
      for (int v = 1; v <= n; v++) {
        max_dist_u = max(max_dist_u, dist[u][v]);
      }
      min_diam = min(min_diam, max_dist_u);
    }
    for (auto e : E) {
      int u, v, w;
      tie(u, v, w) = e;
      vector<pair<int, int>> C;
      for (int z = 1; z <= n; z++) {
        C.push_back({dist[u][z], dist[v][z]});
      }
      sort(C.begin(), C.end());
      reverse(C.begin(), C.end());
      vector<int> a, b;
      a.push_back(C[0].first);
      b.push_back(C[0].second);
      for (int i = 1; i < n; i++) {
        if (b.back() < C[i].second) {
          a.push_back(C[i].first);
          b.push_back(C[i].second);
        }
      }
      for (int i = 0; i + 1 < a.size(); i++) {
        int alpha = (w + b[i] - a[i + 1]) / 2;
        min_diam = min(min_diam, alpha + a[i + 1]);
      }
    }
    printf("%lf\n", .5 * min_diam);
  }
}
