import sys from collections import deque def main(): input = sys.stdin.read().split() ptr = 0 N = int(input[ptr]) ptr += 1 M = int(input[ptr]) ptr += 1 in_edges = [[] for _ in range(N)] out_edges = [[] for _ in range(N)] indegree = [0] * N for _ in range(M): A = int(input[ptr]) ptr += 1 B = int(input[ptr]) ptr += 1 C = int(input[ptr]) ptr += 1 in_edges[B].append((A, C)) out_edges[A].append((B, C)) indegree[B] += 1 # Kahn's algorithm for topological sort queue = deque() for i in range(N): if indegree[i] == 0: queue.append(i) topo_order = [] while queue: u = queue.popleft() topo_order.append(u) for (v, _) in out_edges[u]: indegree[v] -= 1 if indegree[v] == 0: queue.append(v) # Calculate earliest times earliest = [0] * N for u in topo_order: max_e = 0 for (a, c) in in_edges[u]: current = earliest[a] + c if current > max_e: max_e = current earliest[u] = max_e T = earliest[N - 1] # Calculate latest times latest = [float('inf')] * N latest[N - 1] = T for u in reversed(topo_order): if u == N - 1: continue min_l = float('inf') for (v, c) in out_edges[u]: candidate = latest[v] - c if candidate < min_l: min_l = candidate latest[u] = min_l # Count critical nodes critical = 0 for i in range(N): if earliest[i] == latest[i]: critical += 1 P = N - critical print(f"{T} {P}/{N}") if __name__ == "__main__": main()