#include <bits/stdc++.h>
using namespace std;
const double eps = 1e-10;
const int N = 3010;
const int M = 2e4 + 10;
int n, m, cnt, flag;
int head[N], nxt[M], to[N];
double w[M];
int vis[N];
double dis[N];
int read()
{
int f=1,x=0;
char ss=getchar();
while(ss<'0'||ss>'9'){if(ss=='-')f=-1;ss=getchar();}
while(ss>='0'&&ss<='9'){x=x*10+ss-'0';ss=getchar();}
return f*x;
}
void Add(int x, int y, double z)
{
nxt[++cnt] = head[x];
to[cnt] = y;
w[cnt] = z;
head[x] = cnt;
}
void Dfs_Spfa(int u, double x)
{
vis[u] = 1;
for (int i = head[u]; i; i = nxt[i])
{
int v = to[i];
if (dis[v] > dis[u] + w[i] - x)
{
if (vis[v] || flag) {flag = 1; return;}
dis[v] = dis[u] + w[i] - x;
Dfs_Spfa(v, x);
}
}
vis[u] = 0;
}
bool Check(double mid)
{
flag = 0;
for (int i = 1; i <= n; i++) vis[i] = 0, dis[i] = 0;
for (int i = 1; i <= n; i++)
{
Dfs_Spfa(i, mid);
if (flag) return 0;
}
return 1;
}
int main()
{
n = read(), m = read();
for (int i = 1; i <= m; i++)
{
int x, y; double z;
x = read(), y = read();
scanf("%lf", &z);
Add(x, y, z);
}
double l = -1e6, r = 1e6;
while (r - l > eps)
{
double mid = (l + r) / 2;
if (Check(mid)) l = mid;
else r = mid;
}
printf("%.8lf", l);
return 0;
}