#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:100000000,100000000")
using namespace std;
const long long inf = 1e18 + 7;
const long long mod = 1e9 + 7;
const double eps = 1e-9;
const double PI = 2 * acos(0.0);
const double E = 2.71828;
long long n, m;
long long p[205][205], d[205][205];
long long ans = inf;
long long y = 0;
inline long long check(long long a, long long b, long long x) {
  if (x < 0 || x > p[a][b]) return inf;
  long long dist = inf, maxD = 0;
  for (long long i = 0; i < n; i++) {
    dist = min(d[a][i] + x, d[i][b] + p[a][b] - x);
    maxD = max(maxD, dist);
  }
  return maxD;
}
void f(long long a, long long b, long long l, long long r) {
  long long mid = (l + r) / 2;
  long long dist = check(a, b, mid);
  ans = min(ans, dist);
  if (r - l < 2 || dist - (mid - l) >= ans) return;
  f(a, b, l, mid);
  f(a, b, mid, r);
}
int main(void) {
  cin >> n >> m;
  for (long long i = 0; i < n; i++)
    for (long long j = 0; j < n; j++) d[i][j] = inf, p[i][j] = inf;
  for (long long i = 0; i < n; i++) d[i][i] = 0, p[i][i] = 0;
  for (long long i = 0; i < m; i++) {
    long long a, b, c;
    cin >> a >> b >> c;
    a--;
    b--;
    c <<= 1;
    d[a][b] = c;
    d[b][a] = c;
    p[a][b] = c;
    p[b][a] = c;
  }
  for (long long k = 0; k < n; k++)
    for (long long i = 0; i < n; i++)
      for (long long j = 0; j < n; j++)
        d[i][j] = min(d[i][j], d[i][k] + d[k][j]);
  for (long long i = 0; i < n; i++)
    for (long long j = i; j < n; j++)
      if (p[i][j] != inf) f(i, j, 0, p[i][j]);
  cout << setprecision(10) << fixed << ans / 2.0 << endl;
  return 0;
}
