#include <bits/stdc++.h>
using namespace std;
const int N = 100 + 5, M = 5000 + 5;
const double eps = 1e-8;
int n, m;
int e_a[M], e_b[M];
double e_c[M];
double mt[N][N];
double p[N];
inline void print() {
  putchar('\n');
  for (int i = 2; i <= n; ++i, putchar('\n'))
    for (int j = 2; j <= n; ++j) printf("%.5f ", mt[i][j]);
  putchar('\n');
}
inline void gauss() {
  for (int i = 2; i < n; ++i) {
    if (fabs(mt[i][i]) < eps) continue;
    for (int j = 2; j <= n; ++j)
      if (i != j) {
        double t = mt[j][i] / mt[i][i];
        for (int k = i; k <= n; ++k) mt[j][k] -= mt[i][k] * t;
      }
  }
  for (int i = 2; i < n; ++i) {
    mt[i][i] /= mt[i][n];
    mt[i][n] = 1;
  }
  for (int i = 2; i < n; ++i) p[i] = 1.0 / (-mt[i][i]);
  p[n] = 1;
}
bool vis[N];
inline void bfs() {
  queue<int> q;
  q.push(1);
  vis[1] = true;
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    for (int e = 1; e <= m; ++e)
      if (e_a[e] == u || e_b[e] == u) {
        int v;
        if (e_a[e] != u)
          v = e_a[e];
        else
          v = e_b[e];
        if (vis[v]) continue;
        vis[v] = true;
        q.push(v);
      }
  }
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= m; ++i) scanf("%d%d%lf", &e_a[i], &e_b[i], &e_c[i]);
  bfs();
  if (!vis[n]) {
    for (int i = 0; i <= m; ++i) puts("0.00000");
    return 0;
  }
  for (int i = 1; i <= m; ++i) {
    mt[e_a[i]][e_a[i]] -= 1.0;
    mt[e_a[i]][e_b[i]] += 1.0;
    mt[e_b[i]][e_b[i]] -= 1.0;
    mt[e_b[i]][e_a[i]] += 1.0;
  }
  gauss();
  double mx = 0;
  for (int i = 1; i <= m; ++i) {
    double c = fabs(p[e_a[i]] - p[e_b[i]]);
    mx = max(mx, c / e_c[i]);
  }
  double tot = 0;
  for (int i = 1; i <= m; ++i)
    if (e_a[i] == n || e_b[i] == n) tot += fabs(p[e_a[i]] - p[e_b[i]]);
  printf("%.10f\n", tot / mx);
  for (int i = 1; i <= m; ++i) {
    printf("%.10f\n", (p[e_b[i]] - p[e_a[i]]) / mx);
  }
  return 0;
}
