#include <bits/stdc++.h>
using namespace std;
const int N = 200 + 7, M = 40000 + 7;
int n, m;
long long Map[N][N], Ans;
struct NFO {
  int u, v, w;
} A[M];
struct YYZ {
  int u, w;
} B[N][N];
int main() {
  scanf("%d%d", &n, &m);
  int u, v, w, p;
  for (int i = (1), iLimit = (n); i <= iLimit; (++(i)))
    for (int j = (1), jLimit = (n); j <= jLimit; (++(j)))
      Map[i][j] = 2147483647;
  for (int i = (1), iLimit = (n); i <= iLimit; (++(i))) Map[i][i] = 0;
  for (int i = (1), iLimit = (m); i <= iLimit; (++(i)))
    scanf("%d%d%d", &u, &v, &w), Map[u][v] = Map[v][u] = (w << 1),
                                 A[i] = (NFO){u, v, w << 1};
  for (int k = (1), kLimit = (n); k <= kLimit; (++(k)))
    for (int i = (1), iLimit = (n); i <= iLimit; (++(i)))
      for (int j = (1), jLimit = (n); j <= jLimit; (++(j)))
        Map[i][j] = min(Map[i][k] + Map[k][j], Map[i][j]);
  for (int i = (1), iLimit = (n); i <= iLimit; (++(i))) {
    for (int j = (1), jLimit = (n); j <= jLimit; (++(j)))
      B[i][j] = (YYZ){j, (int)Map[i][j]};
    sort(B[i] + 1, B[i] + n + 1, [](YYZ A, YYZ B) { return A.w > B.w; });
  }
  Ans = 2147483647;
  for (int i = (1), iLimit = (n); i <= iLimit; (++(i)))
    Ans = min(Ans, Map[i][B[i][1].u]);
  for (int j = (1), jLimit = (m); j <= jLimit; (++(j))) {
    u = A[j].u, v = A[j].v, w = A[j].w, p = 1;
    for (int i = (2), iLimit = (n); i <= iLimit; (++(i)))
      if (Map[v][B[u][p].u] < Map[v][B[u][i].u]) {
        Ans = min(Ans, (Map[u][B[u][i].u] + Map[v][B[u][p].u] + w) >> 1);
        p = i;
      }
  }
  printf("%.2f\n", Ans / 2.0);
  return 0;
}
