#include #include #include #include #include using namespace std; template inline bool chmax(T& a, T b) { if (a < b) { a = b; return 1; } return 0; } template inline bool chmin(T& a, T b) { if (a > b) { a = b; return 1; } return 0; } using edge = pair; using Graph = vector>; int main() { int n, m; cin >> n >> m; Graph gg(n), rg(n); while (m--) { int a, b, c; cin >> a >> b >> c; gg[a].emplace_back(b, c); rg[b].emplace_back(a, c); } auto early = [&](const Graph &g, int s) { vector dist(g.size(), 0); using Pi = pair; priority_queue que; dist[s] = 0; que.emplace(dist[s], s); vector done(g.size()); while (!que.empty()) { long long cost; int u; tie(cost, u) = que.top(); que.pop(); for (auto &e: g[u]) { int v; long long nc; tie(v, nc) = e; chmax(dist[v], dist[u] + nc); if (++done[v] == rg[v].size()) que.emplace(dist[v], v); } } return dist; }(gg, 0); long long critical = early[n - 1]; auto late = [&](const Graph &g, int s) { vector dist(g.size(), critical); using Pi = pair; priority_queue, greater> que; dist[s] = critical; que.emplace(dist[s], s); vector done(g.size()); while (!que.empty()) { long long cost; int u; tie(cost, u) = que.top(); que.pop(); for (auto &e: g[u]) { int v; long long nc; tie(v, nc) = e; chmin(dist[v], dist[u] - nc); if (++done[v] == gg[v].size()) que.emplace(dist[v], v); } } return dist; }(rg, n - 1); int cnt = 0; for (int i = 0; i < n; i++) cnt += early[i] < late[i]; cout << critical << " " << cnt << "/" << n << endl; return 0; }