#include <bits/stdc++.h>
using namespace std;
const int inf = 0x3f3f3f3f;
const long long oo = 0x3f3f3f3f3f3f3f3fll;
const double eps = 1e-6;
const int N = 110;
const int M = 5010;
double w[N];
int n, m, a[M], b[M], c[M];
struct GaussElimination {
  double mat[N][N];
  void Cal(int n, double w[]) {
    for (int j = 1; j <= n; j++) {
      int bi = j;
      for (int i = j + 1; i <= n; i++)
        if (fabs(mat[i][j]) > fabs(mat[bi][j])) bi = i;
      if (bi != j)
        for (int k = 1; k <= n + 1; k++) swap(mat[j][k], mat[bi][k]);
      if (fabs(mat[j][j]) < eps) continue;
      for (int i = 1; i <= n; i++)
        if (i != j) {
          double koef = mat[i][j] / mat[j][j];
          for (int k = 1; k <= n + 1; k++) mat[i][k] -= koef * mat[j][k];
        }
    }
    for (int i = 1; i <= n; i++) w[i] = mat[i][n + 1] / mat[i][i];
  }
} gao;
int p[N];
int find(int x) {
  if (p[x] != x) p[x] = find(p[x]);
  return p[x];
}
int main() {
  scanf("%d%d", &n, &m);
  for (int i = 1; i <= n; i++) p[i] = i;
  for (int i = 0; i <= n + 1; i++)
    for (int j = 0; j <= n + 1; j++) gao.mat[i][j] = 0;
  for (int i = 0; i < m; i++) {
    scanf("%d%d%d", a + i, b + i, c + i);
    gao.mat[a[i]][b[i]] -= 1;
    gao.mat[b[i]][a[i]] -= 1;
    gao.mat[a[i]][a[i]] += 1;
    gao.mat[b[i]][b[i]] += 1;
    if (find(a[i]) == find(b[i])) continue;
    p[find(a[i])] = find(b[i]);
  }
  if (find(1) != find(n)) {
    for (int i = 0; i <= m; i++) puts("0.0000000000000");
    return 0;
  }
  for (int i = 1; i <= n; i++) gao.mat[1][i] = gao.mat[n][i] = 0;
  gao.mat[n][n + 1] = 1.0;
  gao.mat[1][n + 1] = 0.0;
  gao.mat[1][1] = 1.0;
  gao.mat[n][n] = 1.0;
  gao.Cal(n, w);
  double ret = 1e100;
  for (int i = 0; i < m; i++)
    ret = min(ret, 1.0 * c[i] / fabs(w[a[i]] - w[b[i]]));
  double sum = 0;
  for (int i = 0; i < m; i++)
    if (a[i] == 1 || b[i] == 1) sum += ret * fabs(w[a[i]] - w[b[i]]);
  printf("%.11f\n", sum);
  for (int i = 0; i < m; i++) {
    printf("%.11f\n", (w[b[i]] - w[a[i]]) * ret);
  }
  return 0;
}
