local mfl, mce = math.floor, math.ceil local mmi, mma = math.min, math.max local n, m = io.read("*n", "*n") local edge = {} local invedge = {} local lrem, rrem = {}, {} local llen, rlen = {}, {} for i = 1, n do edge[i], invedge[i] = {}, {} lrem[i], rrem[i] = 0, 0 llen[i], rlen[i] = 0, 0 end for i = 1, m do local a, b, c = io.read("*n", "*n", "*n") a, b = a + 1, b + 1 edge[a][b], invedge[b][a] = c, c lrem[b] = lrem[b] + 1 rrem[a] = rrem[a] + 1 end local tasks = {} for i = 1, n do if lrem[i] == 0 then table.insert(tasks, i) end end for i = 1, n do local src = tasks[i] for dst, cost in pairs(edge[src]) do llen[dst] = mma(llen[dst] ,llen[src] + cost) lrem[dst] = lrem[dst] - 1 if lrem[dst] == 0 then table.insert(tasks, dst) end end end local totlen = llen[n] tasks = {} for i = 1, n do if rrem[i] == 0 then table.insert(tasks, i) end end local denom = n local numer = n for i = 1, n do local src = tasks[i] if rlen[src] + llen[src] == totlen then numer = numer - 1 end for dst, cost in pairs(invedge[src]) do rlen[dst] = mma(rlen[dst], rlen[src] + cost) rrem[dst] = rrem[dst] - 1 if rrem[dst] == 0 then table.insert(tasks, dst) end end end local function getgcd(x, y) while 0 < x do x, y = y % x, x end return y end print(totlen .. " " .. numer .. "/" .. denom)