#include <bits/stdc++.h>
using namespace std;
void rd_cre() {
  freopen("d://dp//data.txt", "w", stdout);
  srand(time(NULL));
}
void rd_ac() {
  freopen("d://dp//data.txt", "r", stdin);
  freopen("d://dp//AC.txt", "w", stdout);
}
void rd_wa() {
  freopen("d://dp//data.txt", "r", stdin);
  freopen("d://dp//WA.txt", "w", stdout);
}
const int N = 210, mod = 1e9 + 7, INF = 0x3f3f3f3f;
const double eps = 1e-6;
int n, m;
int g[N][N], dis[N][N];
pair<int, int> p[10010];
int main() {
  scanf("%d%d", &n, &m);
  memset(g, 0x3f, sizeof(g));
  memset(dis, 0x3f, sizeof(dis));
  for (int i = 1; i <= n; i++) g[i][i] = 0, dis[i][i] = 0;
  for (int i = 1; i <= m; i++) {
    int a, b, c;
    scanf("%d%d%d", &a, &b, &c);
    g[a][b] = g[b][a] = c;
    dis[a][b] = dis[b][a] = c;
  }
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) g[i][j] = min(g[i][j], g[i][k] + g[k][j]);
  int ans = INF;
  for (int u = 1; u <= n; u++) {
    for (int v = u + 1; v <= n; v++) {
      int tot = 0;
      for (int i = 1; i <= n; i++) p[++tot] = {g[i][u], g[i][v]};
      sort(p + 1, p + 1 + tot);
      int idx = tot;
      ans = min(ans, p[idx].first * 2);
      for (int i = tot - 1; i >= 1; i--) {
        if (p[i].second > p[idx].second)
          ans = min(ans, p[idx].second + p[i].first + dis[u][v]), idx = i;
      }
      ans = min(ans, p[idx].second * 2);
    }
  }
  printf("%.2f\n", 1.0 * ans / 2);
  return 0;
}
