#include <bits/stdc++.h>
int edge[211][211], dist[211][211];
int ans;
short rank[211][211];
short n, m, i, j, k, l;
int main() {
  memset(edge, 0x3f, sizeof(edge));
  scanf("%hd %hd", &n, &m);
  while (m--) {
    scanf("%hd %hd %d", &i, &j, edge[0]);
    edge[i][j] = edge[j][i] = edge[0][0];
  }
  memcpy(dist, edge, sizeof(dist));
  for (i = 1; i <= n; ++i) dist[i][i] = 0;
  for (i = 1; i <= n; ++i)
    for (j = 1; j <= n; ++j)
      for (k = j + 1; k <= n; ++k)
        dist[k][j] = dist[j][k] = std::min(dist[j][k], dist[j][i] + dist[i][k]);
  for (i = 1; i <= n; ++i) {
    for (j = 1; j <= n; ++j) rank[i][j] = j;
    std::sort(rank[i] + 1, rank[i] + n + 1,
              [](int a, int b) { return dist[i][a] < dist[i][b]; });
  }
  ans = 0x3f3f3f3f;
  for (i = 1; i <= n; ++i)
    for (j = i + 1; j <= n; ++j)
      if (edge[i][j] != 0x3f3f3f3f) {
        ans = std::min(ans, dist[i][rank[i][n]] << 1);
        ans = std::min(ans, dist[j][rank[j][n]] << 1);
        for (k = n, l = n - 1; l; --l)
          if (dist[j][rank[i][l]] > dist[j][rank[i][k]]) {
            ans = std::min(
                ans, dist[i][rank[i][l]] + dist[i][j] + dist[j][rank[i][k]]);
            k = l;
          }
      }
  printf("%lf\n", (double)ans / 2.0f);
  return 0;
}
