#include <bits/stdc++.h>
using namespace std;
using VI = vector<int>;
using PII = pair<int, int>;
using ll = long long;
struct edge{
int from,to,val;
int next;
}g[200010];
int head[200010];
int n,m;
int idx = 0;
void add(int u, int v , int val){
idx++;
g[idx].from = u;
g[idx].to = v;
g[idx].val = val;
g[idx].next = head[u];
head[u] = idx;
}
int siz[200010];
int in[200010];
double dp[200010];//每个点到终点的期望路径长
//dp[n] = 0;
//从已知的最终状态向前转移
//跑拓扑
//每个点走到 终点的期望 dp[i] = (dp[to] + val) / k
int main(){
cin>>n>>m;
for(int i = 1 ; i <= m ; i++){
int a,b,c;
cin>>a>>b>>c;
add(b,a,c);
in[a] ++;
siz[a] ++;
}
//memset(dp , 126 , sizeof dp);
dp[n] = 0;
queue<int> q;
q.push(n);
while(q.size()){
auto x = q.front();
q.pop();
//cout<<x<<" "<<dp[x]<<" "<< siz[x]<<"\n";
for(int i = head[x] ; i ; i = g[i].next){
int to = g[i].to;
int val = g[i].val;
//cout<<x<<" "<<to<<" "<<val<<"\n";
in[to]--;
dp[to] += val + dp[x];
if(in[to] == 0){
q.push(to);
dp[to] /= siz[to];
}
}
}
printf("%.2lf" , dp[1]);
}
期望dp的 常规设法 , 很有可能是从已知的最终态期望 去 反推需要的期望