#include <bits/stdc++.h>
using namespace std;
struct node {
  int x, y, c;
} e[40010];
int n, m, f[210][210], rk[210][210], A[210];
bool cmp(int a, int b) { return A[a] > A[b]; }
int main() {
  scanf("%d %d", &n, &m);
  memset(f, 63, sizeof(f));
  for (int i = 1; i <= n; i++) f[i][i] = 0;
  for (int i = 1; i <= m; i++) {
    scanf("%d %d %d", &e[i].x, &e[i].y, &e[i].c);
    f[e[i].x][e[i].y] = e[i].c;
    f[e[i].y][e[i].x] = e[i].c;
  }
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) f[i][j] = min(f[i][j], f[i][k] + f[k][j]);
  int ans = 1 << 28;
  for (int i = 1; i <= n; i++) {
    for (int j = 1; j <= n; j++) rk[i][j] = j, A[j] = f[i][j];
    sort(rk[i] + 1, rk[i] + n + 1, cmp);
    ans = min(ans, f[i][rk[i][1]] * 2);
  }
  for (int k = 1; k <= m; k++) {
    int x = e[k].x, y = e[k].y, c = e[k].c;
    for (int i = 1, j = 1; i <= n;) {
      for (j = i + 1; j <= n && f[y][rk[x][i]] >= f[y][rk[x][j]]; j++)
        ;
      if (j == n + 1) break;
      ans = min(ans, f[x][rk[x][j]] + f[y][rk[x][i]] + c);
      i = j;
    }
  }
  printf("%.3lf", (double)ans / 2);
}
