#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 201;
const int MAX_M = 20001;
const int INF = 0x3f3f3f3f;
int n, m;
int a[MAX_M], b[MAX_M], w[MAX_M];
int dis[MAX_N][MAX_N];
pair<int, int> d1[MAX_N], d2[MAX_N];
void solve() {
  for (int k = 1; k <= n; ++k) {
    for (int i = 1; i <= n; ++i) {
      for (int j = 1; j <= n; ++j) {
        if (dis[i][k] != INF && dis[k][j] != INF)
          dis[i][j] = min(dis[i][j], dis[i][k] + dis[k][j]);
      }
    }
  }
  int ret = INF;
  for (int i = 1; i <= m; ++i) {
    int u = a[i], v = b[i];
    for (int j = 0; j < n; ++j)
      d1[j] = pair<int, int>(dis[j + 1][u], dis[j + 1][v]);
    sort(d1, d1 + n);
    int k = 0;
    for (int j = 0; j < n; ++j) {
      while (k > 0 && d2[k - 1].second <= d1[j].second) --k;
      d2[k++] = d1[j];
    }
    if (1 == k)
      ret = min(ret, min(d2[0].first, d2[0].second) << 1);
    else
      for (int j = 1; j < k; ++j) {
        ret = min(ret, w[i] + d2[j - 1].first + d2[j].second);
      }
  }
  printf("%.2lf\n", 1. * ret / 2);
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 0; i <= n; ++i) fill(dis[i], dis[i] + n + 1, INF), dis[i][i] = 0;
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d%d", a + i, b + i, w + i);
    dis[a[i]][b[i]] = dis[b[i]][a[i]] = w[i];
  }
  solve();
  return 0;
}
