#include <bits/stdc++.h>
using namespace std;
struct event {
  double t;
  int val;
  event(double t, int val) : t(t), val(val) {}
  bool operator<(const event& o) const {
    if (t != o.t) return t < o.t;
    return val > o.val;
  }
};
const int MAXN = 205, INF = 1e9;
const double EPS = 1e-10;
int n, m, dist[MAXN][MAXN];
vector<pair<int, int> > graph[MAXN];
void init() {
  for (int i = 1; i <= n; ++i) {
    for (int j = 1; j <= n; ++j) {
      dist[i][j] = (i == j) ? 0 : INF;
    }
  }
}
int floyd() {
  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 ans = INF;
  for (int i = 1; i <= n; ++i) {
    int mx = 0;
    for (int j = 1; j <= n; ++j) mx = max(mx, dist[i][j]);
    ans = min(ans, mx);
  }
  return ans;
}
bool check(double val) {
  vector<event> events;
  for (int i = 1; i <= n; ++i) {
    for (pair<int, int> p : graph[i]) {
      int j = p.first;
      int len = p.second;
      int goal = n;
      events.clear();
      bool flag = true;
      for (int k = 1; k <= n; ++k) {
        double d1 = val - dist[i][k];
        double d2 = val - dist[j][k];
        if (d1 < 0 && d2 < 0) {
          flag = false;
          break;
        }
        if (d1 >= len || d2 >= len || d1 >= len - d2)
          --goal;
        else {
          if (d1 > 0) {
            events.push_back(event(0.0, 1));
            events.push_back(event(d1, -1));
          }
          if (d2 > 0) {
            events.push_back(event(len - d2, 1));
          }
        }
      }
      if (flag) {
        if (goal == 0) return true;
        sort(events.begin(), events.end());
        int cnt = 0;
        for (event e : events) {
          cnt += e.val;
          if (cnt == goal) return true;
        }
      }
    }
  }
  return false;
}
int main() {
  scanf("%d %d", &n, &m);
  init();
  for (int i = 0, u, v, w; i < m; ++i) {
    scanf("%d %d %d", &u, &v, &w);
    w <<= 1;
    graph[u].push_back({v, w});
    graph[v].push_back({u, w});
    dist[u][v] = dist[v][u] = w;
  }
  int ans = floyd();
  int l = 0, r = INF;
  while (l <= r) {
    int mid = (l + r) >> 1;
    if (check(mid))
      r = mid - 1;
    else
      l = mid + 1;
  }
  printf("%lf\n", min(ans, l) / 2.0);
  return 0;
}
