#include <bits/stdc++.h>
using namespace std;
int n, m;
int g[210][210];
int u[40010], v[40010], c[40010];
int ans = 0x7fffffff;
vector<pair<int, int> > t;
inline bool ckmin(int &a, int b) { return b < a ? a = b, 1 : 0; }
int main() {
  scanf("%d%d", &n, &m);
  memset(g, 0x3f, sizeof(g));
  for (int i = 1; i <= n; i++) g[i][i] = 0;
  for (int i = 1; i <= m; i++)
    scanf("%d%d%d", &u[i], &v[i], &c[i]), c[i] <<= 1,
        ckmin(g[u[i]][v[i]], c[i]), ckmin(g[v[i]][u[i]], c[i]);
  for (int k = 1; k <= n; k++)
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) ckmin(g[i][j], g[i][k] + g[k][j]);
  for (int i = 1; i <= m; i++) {
    int r = 0;
    t.clear();
    for (int j = 1; j <= n; j++) t.push_back(pair<int, int>(g[u[i]][j], j));
    sort(t.begin(), t.end(), greater<pair<int, int> >());
    for (vector<pair<int, int> >::iterator p = t.begin(); p != t.end(); p++) {
      int l = g[u[i]][p->second], mid = (l + r + c[i]) / 2;
      if (mid >= l && mid <= l + c[i]) ans = min(ans, mid);
      r = max(r, g[v[i]][p->second]);
    }
  }
  printf("%.3lf\n", ans * .5);
  return 0;
}
