#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <queue>
using namespace std;
const int maxn = 105;
const int INF = 0x3f3f3f3f;
bool vis[maxn];
int n, m, tot1, tot2, head1[maxn], head2[maxn], u, v, cost, x1[maxn], x2[maxn], du1[maxn], du2[maxn], x;
struct Edge {
int to, next, cost, id;
}edge1[maxn*maxn], edge2[maxn*maxn];
void init() {
tot1 = tot2 = 0;
memset(vis, false, sizeof(vis));
memset(head1, -1, sizeof(head1));
memset(head2, -1, sizeof(head2));
memset(x1, 0, sizeof(x1));
memset(x2, INF, sizeof(x2));
memset(du1, 0, sizeof(du1));
memset(du2, 0, sizeof(du2));
}
void addedge1(int u, int v, int cost, int id) {
edge1[tot1].to = v; edge1[tot1].cost = cost; edge1[tot1].id = id; edge1[tot1].next = head1[u];
head1[u] = tot1++;
}
void addedge2(int u, int v, int cost, int id) {
edge2[tot2].to = v; edge2[tot2].cost = cost; edge2[tot2].id = id; edge2[tot2].next = head2[u];
head2[u] = tot2++;
}
struct Ans {
int u, v, id;
bool operator < (const Ans &temp) const {
if (u != temp.u) return u < temp.u;
return id > temp.id;
}
}ans[maxn];
bool topo() {
x = 1;
int tot = 0;
queue<int> q;
for (int i = 1; i <= n; i++) {
if (du1[i] == 0) q.push(i);
}
while (!q.empty()) {
int u = q.front(); q.pop();
tot++;
for (int i = head1[u]; ~i; i = edge1[i].next) {
int v = edge1[i].to, cost = edge1[i].cost;
x1[v] = max(x1[v], x1[u] + cost);
du1[v]--;
if (du1[v] == 0) q.push(v);
}
}
for (int i = 2; i <= n; i++) {
if (x1[x] < x1[i]) x = i;
}
if (tot == n) return true;
return false;
}
void bfs() {
if (!topo()) { printf("0\n"); return; }
int tot = 0;
queue<int> q; q.push(x);
vis[x] = true;
x2[x] = x1[x];
while (!q.empty()) {
int u = q.front(); q.pop();
for (int i = head2[u]; ~i; i = edge2[i].next) {
int v = edge2[i].to, cost = edge2[i].cost, id = edge2[i].id;
x2[v] = min(x2[v], x2[u] - cost);
if (x2[u] - x1[v] == cost) {
ans[++tot].u = v; ans[tot].v = u; ans[tot].id = id;
if (!vis[v]) { q.push(v); vis[v] = true; }
}
}
}
sort(ans + 1, ans + 1 + tot);
printf("%d\n", x1[x]);
for (int i = 1; i <= tot; i++) {
printf("%d->%d\n", ans[i].u, ans[i].v);
}
}
int main() {
init();
scanf("%d %d", &n, &m);
for (int i = 1; i <= m; i++) {
int u, v, cost;
scanf("%d %d %d", &u, &v, &cost);
addedge1(u, v, cost, i);
addedge2(v, u, cost, i);
du1[v]++; du2[u]++;
}
bfs();
return 0;
}