from collections import defaultdict, deque 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) r_adj = defaultdict(list) # 逆辺 for _ in range(M): u, v, l, a = map(int, input().split()) adj[u].append(v) adj2[u].append((v, l, a)) r_adj[v].append(u) def calc_reachables(): reachables = [False] * (N+1) # 頂点 N へ到達可能な頂点 reachables[N] = True q = deque([N]) while q: v = q.popleft() for to in r_adj[v]: if reachables[to]: continue reachables[to] = True q.append(to) return reachables reachables = calc_reachables() tots = [0] * (N+1) cnts = [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: for v in g: if reachables[v]: 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)