#include <bits/stdc++.h>
int g[1002][1002];
int size[1002][1002];
int in[1002], out[1002];
int m;
bool flag;
void pb(int a, int b) {
  g[a][0]++;
  g[a][g[a][0]] = b;
}
void dfs(int x, int start) {
  if (!flag && x == start) {
    puts("0");
    exit(0);
  }
  flag = false;
  if (!out[x])
    printf("%d %d %d\n", start, x, m);
  else {
    if (m > size[x][g[x][1]]) m = size[x][g[x][1]];
    dfs(g[x][1], start);
  }
}
int main() {
  int n, p;
  scanf("%d%d", &n, &p);
  if (p == 0) {
    puts("0");
    exit(0);
  }
  int a, b, c;
  for (int i = 0; i < p; i++) {
    scanf("%d%d%d", &a, &b, &c);
    pb(a, b);
    size[a][b] = c;
    in[b]++;
    out[a]++;
    if (in[b] > 1 || out[a] > 1) {
      puts("0");
      exit(0);
    }
  }
  int tout = 0;
  for (int i = 1; i <= n; i++)
    if (!in[i] && out[i]) tout++;
  printf("%d\n", tout);
  if (tout) {
    for (int i = 1; i <= n; i++) {
      if (!in[i] && out[i]) {
        flag = true;
        m = 1 << 20;
        dfs(i, i);
      }
    }
  }
  return 0;
}
