#include using namespace std; #define ll long long #define ld long double #define pb push_back #define mp make_pair #define pii pair #define pll pair #define pdd pair #define all(x) (x).begin(), (x).end() #define fi first #define se second const int NMAX = 100005; const int inf = 1 << 30; int n, m, cnt, X[NMAX], Y[NMAX], Z[NMAX]; int tsort[NMAX], comp[NMAX], mlc[NMAX], d[NMAX]; int is[NMAX], bun[NMAX]; vector v[NMAX], g[NMAX]; vector C[NMAX], V[NMAX]; bitset viz, inq; deque q; void dfs(int x) { viz[x] = 1; for (auto it : v[x]) if (!viz[it.fi]) dfs(it.fi); tsort[++cnt] = x; } void dfst(int x) { C[cnt].pb(x); comp[x] = cnt; viz[x] = 1; for (auto it : g[x]) if (!viz[it.fi]) dfst(it.fi); } int bf(int source, int where) { for (auto it : C[where]) d[it] = inf, inq[it] = 0, mlc[it] = 0; q.clear(); d[source] = 0; q.pb(source); inq[source] = 1; while (!q.empty()) { int x = q.front(); q.pop_front(); inq[x] = 0; mlc[x]++; if (mlc[x] == (int)C[where].size() + 1) return 1; for (auto it : v[x]) if (comp[it.fi] == where && d[x] + it.se < d[it.fi]) { d[it.fi] = d[x] + it.se; if (!inq[it.fi]) { inq[it.fi] = 1; q.pb(it.fi); } } } return 0; } void go(int x) { bun[x] = is[x]; viz[x] = 1; for (auto it : V[x]) if (!viz[it]) { go(it); bun[x] |= bun[it]; } } int main() { cin.sync_with_stdio(false); cin >> n >> m; for (int i = 1; i <= m; i++) { cin >> X[i] >> Y[i] >> Z[i]; v[X[i]].pb(mp(Y[i], Z[i])); g[Y[i]].pb(mp(X[i], Z[i])); } for (int i = 1; i <= n; i++) if (!viz[i]) dfs(i); viz = 0; cnt = 0; for (int i = n; i; i--) { int x = tsort[i]; if (!viz[x]) cnt++, dfst(x); } for (int i = 1; i <= m; i++) V[comp[X[i]]].pb(comp[Y[i]]); for (int i = 1; i <= cnt; i++) { sort(all(V[i])); V[i].resize(unique(V[i].begin(), V[i].end()) - V[i].begin()); } for (int i = 1; i <= cnt; i++) is[i] = bf(C[i][0], i); viz = 0; for (int i = 1; i <= cnt; i++) if (!viz[i]) go(i); int SOL = 0; for (int i = 1; i <= cnt; i++) if (bun[i]) SOL += (int)C[i].size(); cout << SOL; return 0; }