#include <bits/stdc++.h>
using namespace std;
int on_bit(int x, int pos) {
  x |= (1 << pos);
  return x;
}
int off_bit(int x, int pos) {
  x &= ~(1 << pos);
  return x;
}
bool is_on_bit(int x, int pos) { return ((x & (1 << pos)) != 0); }
int flip_bit(int x, int pos) {
  x ^= (1 << pos);
  return x;
}
int lsb(int x) { return x & (-x); }
int on_bit_all(int x, int pos) {
  x = (1 << pos) - 1;
  return x;
}
const double EPS = 1e-9;
const double PI = 2 * acos(0.0);
const int INF = 0x3f3f3f3f;
const long long LLINF = 1e18;
const int MOD = 1e8;
int add(long long a, long long b) { return ((a % MOD) + (b % MOD)) % MOD; }
int sub(long long a, long long b) { return ((a % MOD) - (b % MOD)) % MOD; }
int mult(long long a, long long b) { return ((a % MOD) * (b % MOD)) % MOD; }
long long gcd(long long a, long long b) { return b ? gcd(b, a % b) : a; }
long long lcm(long long a, long long b) { return a / gcd(a, b) * b; }
const int N = 1e3 + 10;
int in_degree[N];
int out_degree[N];
bool vis[N];
set<pair<pair<int, int>, int> > res;
vector<vector<pair<int, int> > > g(N);
void dfs(int u, int *root, int cost) {
  vis[u] = true;
  if (out_degree[u] == 0 && in_degree[u] == 1) {
    res.insert(make_pair(pair<int, int>((*root) + 1, u + 1), cost));
  }
  for (int i = 0; i < (int)((int)(g[u]).size()); i++) {
    if (!vis[g[u][i].first]) {
      dfs(g[u][i].first, root, min(cost, g[u][i].second));
    }
  }
}
int main() {
  memset(in_degree, 0, sizeof(in_degree));
  memset(out_degree, 0, sizeof(out_degree));
  int n, p;
  scanf("%d%d", &n, &p);
  for (int i = 0; i < (int)p; i++) {
    int qwe, asd, zxc;
    scanf("%d%d%d", &qwe, &asd, &zxc);
    qwe--;
    asd--;
    g[qwe].push_back(pair<int, int>(asd, zxc));
    out_degree[qwe]++;
    in_degree[asd]++;
  }
  vector<int> roots;
  for (int i = 0; i < (int)n; i++) {
    if (in_degree[i] == 0 && out_degree[i] == 1) {
      roots.push_back(i);
    }
  }
  for (int i = 0; i < (int)((int)(roots).size()); i++) {
    memset(vis, 0, sizeof(vis));
    dfs(roots[i], &roots[i], INF);
  }
  printf("%d\n", ((int)(res).size()));
  for (__typeof(res.begin()) it = res.begin(); it != res.end(); it++)
    printf("%d %d %d\n", (it->first).first, (it->first).second, it->second);
  return 0;
}
