/* */ //#pragma comment(linker, "/STACK:16777216") #define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #define y0 sdkfaslhagaklsldk #define y1 aasdfasdfasdf #define yn askfhwqriuperikldjk #define j1 assdgsdgasghsf #define tm sdfjahlfasfh #define lr asgasgash #define norm asdfasdgasdgsd #define eps 1e-9 #define M_PI 3.141592653589793 #define bs 1000000007 #define bsize 512 const int N = 200000; using namespace std; int n, m; vector order; vector > g[N]; int memo[N]; int ans; int ITER; int L[N]; int in_queue[N]; int times[N]; int dist[N]; int solve(int v) { ++ITER; queue qu; qu.push(v); L[v] = ITER; in_queue[v] = 1; times[v] = 0; dist[v] = 0; while (qu.size()) { int v = qu.front(); times[v]++; if (times[v] > n) { return 1; } in_queue[v] = 0; qu.pop(); for (int i = 0; i < g[v].size(); i++) { int to = g[v][i].first; int to_cost = g[v][i].second; if (memo[to] != -1) { if (memo[to] == 1) return 1; continue; } int cur_dist; if (L[to] != ITER) cur_dist = 1e9; else cur_dist = dist[to]; if (to_cost + dist[v] < cur_dist) { dist[to] = to_cost + dist[v]; if (in_queue[to] == 0) { qu.push(to); in_queue[to] = 1; } cur_dist = to_cost + dist[v]; } L[to] = ITER; dist[to] = cur_dist; } } return 0; } int main(){ //freopen("route.in","r",stdin); //freopen("route.out","w",stdout); //freopen("F:/in.txt", "r", stdin); //freopen("F:/output.txt", "w", stdout); ios_base::sync_with_stdio(0); //cin.tie(0); cin >> n >> m; for (int i = 1; i <= m; i++) { int a, b, c; cin >> a >> b >> c; g[a].push_back(make_pair(b, c)); } for (int i = 1; i <= n; i++) { order.push_back(i); } random_shuffle(order.begin(), order.end()); for (int i = 1; i <= n; i++) memo[i] = -1; for (int i = 0; i < order.size(); i++) { int res = solve(order[i]); memo[order[i]] = res; ans += res; //ans+=solve(order[i]); } cout << ans << endl; cin.get(); cin.get(); return 0; }