#python3
import sys
from collections import deque
def createGroups(v,visited,adj,counter,groups):
if counter not in visited:
visited[counter] = {}
print(visited[counter])
if v not in visited[counter]:
visited[counter][v] = counter
if len(groups)==counter:
groups.append([])
groups[counter].append(v)
for a in adj[v]:
if a not in visited[counter]:
createGroups(a,visited,adj,counter,groups)
counter += 1
else:
for a in adj[v]:
if a not in visited[counter]:
createGroups(a,visited,adj,counter,groups)
return counter
#searches for all reachable vertices from v, following an adjacency list
def explore(v,visited,adj,counter,groupStart):
if v not in visited:
visited[v] = counter
for a in adj[v]:
if a not in visited:
explore(a,visited,adj,counter,groupStart)
groupStart[counter] = v
counter += 1
else:
for a in adj[v]:
if a not in visited:
explore(a,visited,adj,counter,groupStart)
return counter
def relax(u,v,w,dist,prev):
if dist[u]+w < dist[v]:
dist[v] = dist[u]+w
prev[v] = u
def bellmanFord(V,E,s):
dist = [float('inf')] * V
prev = [None] * V
dist[s] = 0
for i in range(V-1):
for edge in E:
relax(edge[0],edge[1],edge[2],dist,prev)
for e in E:
u = e[0]
v = e[1]
w = e[2]
if dist[u]+w < dist[v]:
return 1
return 0
def negative_cycles(adj,E):
visited = {}
counter = 0
groupStart = {}
groups = []
for v in range(len(adj)):
counter = explore(v,visited,adj,counter,groupStart)
if counter==1:
return bellmanFord(len(adj), E, 0)
else:
c = 0
while c<counter:
if bellmanFord(len(adj), E, groupStart[c])==1:
return 1
c +=1
return 0
if __name__ == '__main__':
input = sys.stdin.read()
data = list(map(int, input.split()))
n, m = data[0:2]
data = data[2:]
edges = list(zip(zip(data[0:(3 * m):3], data[1:(3 * m):3]), data[2:(3 * m):3]))
data = data[3 * m:]
adj = [[] for _ in range(n)]
cost = [[] for _ in range(n)]
for ((a, b), w) in edges:
adj[a - 1].append(b - 1)
cost[a - 1].append(w)
edg = []
for e in edges:
edg.append([e[0][0]-1,e[0][1]-1,e[1]])
print(negative_cycles(adj, edg))
I3B5dGhvbjMKCmltcG9ydCBzeXMKZnJvbSBjb2xsZWN0aW9ucyBpbXBvcnQgZGVxdWUKCgpkZWYgY3JlYXRlR3JvdXBzKHYsdmlzaXRlZCxhZGosY291bnRlcixncm91cHMpOgogICAgaWYgY291bnRlciBub3QgaW4gdmlzaXRlZDoKICAgICAgICB2aXNpdGVkW2NvdW50ZXJdID0ge30KICAgIHByaW50KHZpc2l0ZWRbY291bnRlcl0pCiAgICBpZiB2IG5vdCBpbiB2aXNpdGVkW2NvdW50ZXJdOgogICAgICAgIHZpc2l0ZWRbY291bnRlcl1bdl0gPSBjb3VudGVyCiAgICAgICAgaWYgbGVuKGdyb3Vwcyk9PWNvdW50ZXI6CiAgICAgICAgICAgIGdyb3Vwcy5hcHBlbmQoW10pCiAgICAgICAgZ3JvdXBzW2NvdW50ZXJdLmFwcGVuZCh2KQogICAgICAgIGZvciBhIGluIGFkalt2XToKICAgICAgICAgICAgaWYgYSBub3QgaW4gdmlzaXRlZFtjb3VudGVyXToKICAgICAgICAgICAgICAgIGNyZWF0ZUdyb3VwcyhhLHZpc2l0ZWQsYWRqLGNvdW50ZXIsZ3JvdXBzKQogICAgICAgIGNvdW50ZXIgKz0gMQogICAgZWxzZToKICAgICAgICBmb3IgYSBpbiBhZGpbdl06CiAgICAgICAgICAgIGlmIGEgbm90IGluIHZpc2l0ZWRbY291bnRlcl06CiAgICAgICAgICAgICAgICBjcmVhdGVHcm91cHMoYSx2aXNpdGVkLGFkaixjb3VudGVyLGdyb3VwcykKICAgIAogICAgcmV0dXJuIGNvdW50ZXIgCiAgICAKICAgIAojc2VhcmNoZXMgZm9yIGFsbCByZWFjaGFibGUgdmVydGljZXMgZnJvbSB2LCBmb2xsb3dpbmcgYW4gYWRqYWNlbmN5IGxpc3QKZGVmIGV4cGxvcmUodix2aXNpdGVkLGFkaixjb3VudGVyLGdyb3VwU3RhcnQpOgogICAgaWYgdiBub3QgaW4gdmlzaXRlZDoKICAgICAgICB2aXNpdGVkW3ZdID0gY291bnRlcgogICAgICAgIGZvciBhIGluIGFkalt2XToKICAgICAgICAgICAgaWYgYSBub3QgaW4gdmlzaXRlZDoKICAgICAgICAgICAgICAgIGV4cGxvcmUoYSx2aXNpdGVkLGFkaixjb3VudGVyLGdyb3VwU3RhcnQpCiAgICAgICAgZ3JvdXBTdGFydFtjb3VudGVyXSA9IHYKICAgICAgICBjb3VudGVyICs9IDEKICAgIGVsc2U6CiAgICAgICAgZm9yIGEgaW4gYWRqW3ZdOgogICAgICAgICAgICBpZiBhIG5vdCBpbiB2aXNpdGVkOgogICAgICAgICAgICAgICAgZXhwbG9yZShhLHZpc2l0ZWQsYWRqLGNvdW50ZXIsZ3JvdXBTdGFydCkKICAgIHJldHVybiBjb3VudGVyICAKCmRlZiByZWxheCh1LHYsdyxkaXN0LHByZXYpOgogICAgaWYgZGlzdFt1XSt3IDwgZGlzdFt2XToKICAgICAgICBkaXN0W3ZdID0gZGlzdFt1XSt3CiAgICAgICAgcHJldlt2XSA9IHUKICAgICAgICAKZGVmIGJlbGxtYW5Gb3JkKFYsRSxzKToKICAgIGRpc3QgPSBbZmxvYXQoJ2luZicpXSAqIFYKICAgIHByZXYgPSBbTm9uZV0gKiBWCiAgICBkaXN0W3NdID0gMAogICAgCiAgICBmb3IgaSBpbiByYW5nZShWLTEpOgogICAgICAgIGZvciBlZGdlIGluIEU6CiAgICAgICAgICAgIHJlbGF4KGVkZ2VbMF0sZWRnZVsxXSxlZGdlWzJdLGRpc3QscHJldikKICAgICAgICAgICAgICAKICAgIGZvciBlIGluIEU6CiAgICAgICAgdSA9IGVbMF0KICAgICAgICB2ID0gZVsxXQogICAgICAgIHcgPSBlWzJdCiAgICAgICAgaWYgZGlzdFt1XSt3IDwgZGlzdFt2XToKICAgICAgICAgICAgcmV0dXJuIDEgICAgCiAgICAKICAgIHJldHVybiAwCgogICAgCgpkZWYgbmVnYXRpdmVfY3ljbGVzKGFkaixFKToKICAgIHZpc2l0ZWQgPSB7fQogICAgY291bnRlciA9IDAKICAgIGdyb3VwU3RhcnQgPSB7fQogICAgZ3JvdXBzID0gW10KICAgIAogICAgZm9yIHYgaW4gcmFuZ2UobGVuKGFkaikpOgogICAgICAgIGNvdW50ZXIgPSBleHBsb3JlKHYsdmlzaXRlZCxhZGosY291bnRlcixncm91cFN0YXJ0KSAgICAKICAgIAogICAgaWYgY291bnRlcj09MToKICAgICAgICByZXR1cm4gYmVsbG1hbkZvcmQobGVuKGFkaiksIEUsIDApCiAgICBlbHNlOgogICAgICAgIGMgPSAwCiAgICAgICAgd2hpbGUgYzxjb3VudGVyOgogICAgICAgICAgICBpZiBiZWxsbWFuRm9yZChsZW4oYWRqKSwgRSwgZ3JvdXBTdGFydFtjXSk9PTE6CiAgICAgICAgICAgICAgICByZXR1cm4gMQogICAgICAgICAgICBjICs9MQogICAgcmV0dXJuIDAKCgppZiBfX25hbWVfXyA9PSAnX19tYWluX18nOgogICAgaW5wdXQgPSBzeXMuc3RkaW4ucmVhZCgpCiAgICBkYXRhID0gbGlzdChtYXAoaW50LCBpbnB1dC5zcGxpdCgpKSkKICAgIG4sIG0gPSBkYXRhWzA6Ml0KICAgIGRhdGEgPSBkYXRhWzI6XQogICAgZWRnZXMgPSBsaXN0KHppcCh6aXAoZGF0YVswOigzICogbSk6M10sIGRhdGFbMTooMyAqIG0pOjNdKSwgZGF0YVsyOigzICogbSk6M10pKQogICAgZGF0YSA9IGRhdGFbMyAqIG06XQogICAgYWRqID0gW1tdIGZvciBfIGluIHJhbmdlKG4pXQogICAgY29zdCA9IFtbXSBmb3IgXyBpbiByYW5nZShuKV0KICAgIGZvciAoKGEsIGIpLCB3KSBpbiBlZGdlczoKICAgICAgICBhZGpbYSAtIDFdLmFwcGVuZChiIC0gMSkKICAgICAgICBjb3N0W2EgLSAxXS5hcHBlbmQodykKICAgIAogICAgZWRnID0gW10KICAgIGZvciBlIGluIGVkZ2VzOgogICAgICAgIGVkZy5hcHBlbmQoW2VbMF1bMF0tMSxlWzBdWzFdLTEsZVsxXV0pCiAgICAKICAgIHByaW50KG5lZ2F0aXZlX2N5Y2xlcyhhZGosIGVkZykpCiAgICAKICAgIA==