#include <bits/stdc++.h>
using namespace std;
int x, y, z, inf = 1e9, f[210][210], n, m, Max[210];
pair<pair<int, int>, int> p[40010];
pair<int, int> q[210];
void read(int &x) {
  char ch = getchar();
  int mark = 1;
  for (; ch != '-' && (ch < '0' || ch > '9'); ch = getchar())
    ;
  if (ch == '-') mark = -1, ch = getchar();
  for (x = 0; ch >= '0' && ch <= '9'; ch = getchar()) x = x * 10 + ch - 48;
  x *= mark;
}
int main() {
  read(n);
  read(m);
  for (int i = 1; i <= n; i++)
    for (int j = i + 1; j <= n; j++) f[i][j] = f[j][i] = inf;
  for (int i = 1; i <= m; i++) {
    read(x);
    read(y);
    read(z);
    f[x][y] = f[y][x] = z;
    p[i] = make_pair(make_pair(x, y), z);
  }
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      if (i != k)
        for (int j = 1; j <= n; j++)
          if (j != i && j != k) f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
  double Min = 1e9;
  for (int i = 1; i <= n; i++) {
    double Max = 0;
    for (int j = 1; j <= n; j++) Max = max(Max, (double)f[i][j]);
    Min = min(Min, Max);
  }
  for (int i = 1; i <= m; i++) {
    int x = p[i].first.first, y = p[i].first.second;
    for (int j = 1; j <= n; j++) q[j] = make_pair(f[x][j], f[y][j]);
    sort(q + 1, q + n + 1);
    Max[n + 1] = 0;
    for (int j = n; j; j--) Max[j] = max(Max[j + 1], q[j].second);
    for (int j = 1; j <= n; j++) {
      int l = q[j].first, r = Max[j + 1];
      if (l > r) swap(l, r);
      if (l + p[i].second >= r) Min = min(Min, (l + p[i].second + r) / 2.0);
    }
  }
  printf("%.1lf\n", Min);
  return 0;
}
