#include <bits/stdc++.h>
using namespace std;
long long mat[205][205];
long long edges[205][205];
const long long inf = 1LL << 30;
int main() {
  int n, m, u, v, w;
  cin >> n >> m;
  for (int i = 0; i < n; i++)
    for (int j = 0; j < n; j++) mat[i][j] = inf;
  for (int i = 0; i < n; i++) mat[i][i] = 0;
  memset(edges, -1, sizeof edges);
  for (int i = 0; i < m; i++) {
    cin >> u >> v >> w;
    w *= 2;
    u--, v--;
    edges[u][v] = w;
    mat[u][v] = w;
    mat[v][u] = w;
  }
  for (int k = 0; k < n; k++)
    for (int i = 0; i < n; i++)
      for (int j = 0; j < n; j++)
        mat[i][j] = min(mat[i][j], mat[i][k] + mat[k][j]);
  int ans = 1 << 30;
  for (int f = 0; f < n; f++) {
    for (int t = 0; t < n; t++) {
      if (edges[f][t] == -1) continue;
      int len = edges[f][t];
      map<int, vector<int> > events;
      set<pair<int, int> > l, r;
      events[0];
      events[len];
      for (int node = 0; node < n; node++) {
        int a = mat[f][node];
        int b = mat[node][t];
        int x = (b - a + len) / 2;
        if (x > 0 && x <= len) events[x].push_back(node);
        if (a < b + len)
          l.insert(make_pair(a, node));
        else
          r.insert(make_pair(b, node));
      }
      map<int, vector<int> >::iterator it;
      for (it = events.begin(); it != events.end(); it++) {
        vector<int>& tmp = (*it).second;
        for (int i = 0; i < (int)tmp.size(); i++) {
          int node = tmp[i];
          int a = mat[f][node];
          int b = mat[node][t];
          l.erase(make_pair(a, node));
          r.insert(make_pair(b, node));
        }
        int a = 0, b = 0;
        if (l.size()) a = (*l.rbegin()).first;
        if (r.size()) b = (*r.rbegin()).first;
        int res = (a + b + len) / 2;
        if (res - a > len || res - a < 0) continue;
        ans = min(ans, res);
      }
    }
  }
  printf("%.25lf", ans / 2.0);
}
