#include using namespace std; vector > G[100100], GT[100100]; vector > g[100100]; int dmin[100100], len[100100], stk[100100], vis[100100]; queue Q; vector comp; bool inQ[100100], mark[100100]; bool isNegative; void bellman(int nod, int n) { isNegative = 0; Q.empty(); Q.push(nod); dmin[nod] = 0; inQ[nod] = 1; while (!Q.empty()) { vector > :: iterator it; nod = Q.front(); inQ[nod] = 0; Q.pop(); for (it = g[nod].begin(); it != g[nod].end(); ++it) if (dmin[nod] + it -> second < dmin[it -> first]) { dmin[it -> first] = dmin[nod] + it -> second; len[it -> first] = len[nod] + 1; if (len[it -> first] > n) { isNegative = 1; return ; } if (!inQ[it -> first]) { inQ[it -> first] = 1; Q.push(it -> first); } } } } void dfs1(int nod) { vis[nod] = 1; vector > :: iterator it; for (it = GT[nod].begin(); it != GT[nod].end(); ++it) if (!vis[it -> first]) dfs1(it -> first); stk[++stk[0]] = nod; } void dfs2(int nod) { vis[nod] = 1; comp.push_back(nod); vector > :: iterator it; for (it = G[nod].begin(); it != G[nod].end(); ++it) { if (!vis[it -> first]) dfs2(it -> first); g[nod].push_back(make_pair(it -> first, it -> second)); } } void dfs3(int nod) { vis[nod] = 1; vector > :: iterator it; for (it = GT[nod].begin(); it != GT[nod].end(); ++it) if (!vis[it -> first]) dfs3(it -> first); } int main() { //freopen("data.in", "r", stdin); //freopen("data.out", "w", stdout); int n, m; scanf("%d%d", &n, &m); for (int i = 1; i <= m; ++i) { int xx, yy, cc; scanf("%d%d%d", &xx, &yy, &cc); G[xx].push_back(make_pair(yy, cc)); GT[yy].push_back(make_pair(xx, cc)); } for (int i = 1; i <= n; ++i) dmin[i] = 1000000000 / 2; for (int i = 1; i <= n; ++i) if (!vis[i]) dfs1(i); memset(vis, 0, sizeof(vis)); for (int i = n; i >= 1; --i) if (!vis[stk[i]]) { dfs2(stk[i]); bellman(stk[i], comp.size()); if (isNegative) for (int j = 0; j < comp.size(); ++j) mark[comp[j]] = 1; for (int j = 0; j < comp.size(); ++j) g[comp[j]].clear(); comp.clear(); } memset(vis, 0, sizeof(vis)); for (int i = 1; i <= n; ++i) if (mark[i]) dfs3(i); int sum = 0; for (int i = 1; i <= n; ++i) sum += vis[i]; printf("%d", sum); return 0; }