#define _CRT_SECURE_NO_WARNINGS #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; #define INF (1<<29) #define rep(i,n) for(int i=0;i<(int)(n);i++) #define all(v) v.begin(),v.end() #define uniq(v) v.erase(unique(all(v)),v.end()) vector topologicalSort(int v, const vector edge[]) { vector zeros; vector in(v), res; for (int i = 0; i e[100000]; vector> edge[100000]; int dp[100000]; bool critical[100000]; int main() { ios::sync_with_stdio(0); cin.tie(0); cin >> n >> m; rep(i,m) { int a, b, c; cin >> a >> b >> c; e[a].push_back(b); edge[a].emplace_back(b, c); } auto ord = topologicalSort(n, e); rep(i,n) { for (auto p : edge[ord[i]]) { dp[p.first] = max(dp[p.first], dp[ord[i]] + p.second); } } critical[n - 1] = true; int cnt = 0; for (int i = n - 2; i >= 0;i--){ bool f = true; for (auto p : edge[ord[i]]) { if (critical[p.first] && dp[p.first] == dp[ord[i]] + p.second)f = false; } if (f)cnt++; else critical[ord[i]] = true; } cout << dp[n - 1] << ' ' << cnt << '/' << n << endl; return 0; }