#include <bits/stdc++.h>
using namespace std;
const int N = 505, M = 5005, INF = 10000005;
struct sl {
  int x, y, v;
} line[M];
int n, m, z, x, y, p;
double ans, b, point[N], v[N][N + 1], va, fa[N];
inline int findf(int l) { return (fa[l] == l ? l : fa[l] = findf(fa[l])); }
inline void gauss() {
  for (int i = 1; i <= n; ++i) {
    p = 0;
    va = 0;
    for (int j = i; j <= n; ++j)
      if (fabs(v[j][i]) > fabs(va)) va = v[j][i], p = j;
    for (int j = 1; j <= n + 1; ++j) swap(v[p][j], v[i][j]);
    if (fabs(v[i][i]) <= 1e-8) continue;
    if (v[i][i] != 0)
      for (int j = 1; j <= n; ++j)
        if (j != i) {
          b = v[j][i] / v[i][i];
          for (int k = 1; k <= n + 1; ++k) v[j][k] -= v[i][k] * b;
        }
  }
  for (int i = 1; i <= n; ++i)
    if (fabs(v[i][i]) > 1e-8) point[i] = v[i][n + 1] / v[i][i];
}
int main() {
  scanf("%d", &n);
  scanf("%d", &m);
  for (int i = 1; i <= n; ++i) fa[i] = i;
  for (int i = 1; i <= m; ++i) {
    scanf("%d%d%d", &line[i].x, &line[i].y, &line[i].v);
    x = findf(line[i].x);
    y = findf(line[i].y);
    if (x != y) fa[x] = y;
    --v[line[i].x][line[i].x];
    ++v[line[i].x][line[i].y];
    ++v[line[i].y][line[i].x];
    --v[line[i].y][line[i].y];
  }
  if (findf(1) != findf(n)) {
    for (int i = 1; i <= m + 1; ++i) printf("0.000000\n");
    return 0;
  }
  for (int i = 1; i <= n + 1; ++i) v[1][i] = v[n][i] = 0;
  v[1][1] = v[n][n] = 1;
  v[1][n + 1] = 2;
  v[n][n + 1] = 1;
  gauss();
  b = INF;
  for (int i = 1; i <= m; ++i)
    b = min(b, line[i].v / fabs(point[line[i].x] - point[line[i].y]));
  ans = 0;
  for (int i = 1; i <= n; ++i) point[i] = point[i] * b;
  for (int i = 1; i <= m; ++i)
    if (line[i].x == 1 || line[i].y == 1)
      ans += fabs(point[line[i].x] - point[line[i].y]);
  printf("%.5lf\n", ans);
  for (int i = 1; i <= m; ++i)
    printf("%.5lf\n", point[line[i].x] - point[line[i].y]);
}
