#include <bits/stdc++.h>
using namespace std;
int a[210][210];
int res = 0x3f3f3f3f;
int n;
void work(int u, int v) {
  int i, j, sz, z = 0x3f3f3f3f;
  vector<pair<int, int> > x, y;
  for (i = 1; i <= n; i++) x.push_back(make_pair(a[u][i], a[v][i]));
  sort(x.begin(), x.end());
  for (i = 0; i < n; i++) {
    while (y.size() && y.back().second <= x[i].second) y.pop_back();
    y.push_back(x[i]);
  }
  if (y.size() == 1)
    res = min(res, min(y[0].first, y[0].second) << 1);
  else
    for (sz = y.size(), i = 0; i < sz - 1; i++) {
      res = min(res, a[u][v] + y[i].first + y[i + 1].second);
    }
}
int main() {
  int i, j, u, v, k, w;
  scanf("%d%d", &n, &k);
  for (i = 1; i <= n; i++)
    for (j = 1; j <= n; j++) a[i][j] = (i == j) ? 0 : 0x3f3f3f3f;
  while (k--) {
    scanf("%d%d%d", &u, &v, &w);
    a[u][v] = a[v][u] = w;
  }
  for (k = 1; k <= n; k++)
    for (i = 1; i <= n; i++)
      for (j = 1; j <= n; j++)
        if (a[i][j] > a[i][k] + a[k][j]) a[i][j] = a[i][k] + a[k][j];
  for (i = 1; i <= n; i++)
    for (j = i; j <= n; j++)
      if (a[i][j] != 0x3f3f3f3f) work(i, j);
  printf("%.20lf\n", res * .5);
  return 0;
}
