Problem: Berland traffic is very different from traffic in other countries. The capital of Berland consists of n junctions and m roads. Each road connects a pair of junctions. There can be multiple roads between a pair of junctions. For each road we know its capacity: value ci is the maximum number of cars that can drive along a road in any direction per a unit of time. For each road, the cars can drive along it in one of two direction. That it, the cars can't simultaneously move in both directions. A road's traffic is the number of cars that goes along it per a unit of time. For road (ai, bi) this value is negative, if the traffic moves from bi to ai. A road's traffic can be a non-integer number.

The capital has two special junctions — the entrance to the city (junction 1) and the exit from the city (junction n). For all other junctions it is true that the traffic is not lost there. That is, for all junctions except for 1 and n the incoming traffic sum equals the outgoing traffic sum.

Traffic has an unusual peculiarity in the capital of Berland — for any pair of junctions (x, y) the sum of traffics along any path from x to y doesn't change depending on the choice of the path. Such sum includes traffic along all roads on the path (possible with the "minus" sign, if the traffic along the road is directed against the direction of the road on the path from x to y).

Your task is to find the largest traffic that can pass trough the city per one unit of time as well as the corresponding traffic for each road. 

Input

The first line contains a positive integer n — the number of junctions (2 ≤ n ≤ 100). The second line contains integer m (1 ≤ m ≤ 5000) — the number of roads. Next m lines contain the roads' descriptions. Each road contains a group of three numbers ai, bi, ci, where ai, bi are the numbers of junctions, connected by the given road, and ci (1 ≤ ai, bi ≤ n; ai ≠ bi; 0 ≤ ci ≤ 10000) is the largest permissible traffic along this road.

Output

In the first line print the required largest traffic across the city. Then print m lines, on each line print the speed, at which the traffic moves along the corresponding road. If the direction doesn't match the order of the junctions, given in the input, then print the traffic with the minus sign. Print the numbers with accuracy of at least five digits after the decimal point.

If there are many optimal solutions, print any of them.

Examples

Input

2
3
1 2 2
1 2 4
2 1 1000


Output

6.00000
2.00000
2.00000
-2.00000


Input

7
11
1 2 7
1 2 7
1 3 7
1 4 7
2 3 7
2 5 7
3 6 7
4 7 7
5 4 7
5 6 7
6 7 7


Output

13.00000
2.00000
2.00000
3.00000
6.00000
1.00000
3.00000
4.00000
7.00000
1.00000
2.00000
6.00000

Solution (in CPP):

Solution:
#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;
}