from collections import defaultdict from atcoder.scc import SCCGraph def scc(n: int, adj: dict[int, list[int]]) -> list[list[int]]: """グラフを強連結成分分解する。 Args: n: 頂点数 adj: 隣接リスト {u: [v...]} Returns: 強連結成分のリスト (トポロジカル順) """ g = SCCGraph(n) for u, vs in adj.items(): for v in vs: g.add_edge(u, v) return g.scc() MOD = 10**9 + 7 N, M = map(int, input().split()) adj = defaultdict(list) adj2 = defaultdict(list) for _ in range(M): u, v, l, a = map(int, input().split()) adj[u].append(v) adj2[u].append((v, l, a)) cnts = [0] * (N+1) tots = [0] * (N+1) cnts[0] = 1 b = False cc = scc(N+1, adj) for g in cc: if 0 in g: b = True if not b: continue if len(g) > 1: print('INF') exit() for v in g: for to, l, a in adj2[v]: tots[to] += (tots[v] + cnts[v] * l) * a tots[to] %= MOD cnts[to] += cnts[v] * a cnts[to] %= MOD ans = tots[N] print(ans)