#include <bits/stdc++.h>

using namespace std;

vector <pair <int, int> > G[100100], GT[100100];
vector <pair <int, int> > g[100100];

int dmin[100100], len[100100], stk[100100], vis[100100];
queue <int> Q;
vector <int> 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 <pair <int, int> > :: 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 <pair <int, int> > :: 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 <pair <int, int> > :: 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 <pair <int, int> > :: 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;
}