#include using namespace std; #define REP(i,a,n) for(int i=(a); i<(int)(n); i++) #define rep(i,n) REP(i,0,n) #define FOR(it,c) for(__typeof((c).begin()) it=(c).begin(); it!=(c).end(); ++it) #define ALLOF(c) (c).begin(), (c).end() typedef long long ll; typedef unsigned long long ull; class SCC { int V; std::vector> G, rG; std::vector vs; std::vector used; std::vector cmp; void dfs(int v){ used[v] = true; for(int i=0; i get_edge(int from){ return G[from]; } void add_edge(int from, int to){ G[from].push_back(to); rG[to].push_back(from); } // 強連結成分(2点が相互に行き来できるグループ)数 int scc(){ for(int i=0; i=0; i--) if(!used[vs[i]]) rdfs(vs[i], k++); return k; } // サイクルがあるか bool iscyclic(){ return scc() != V; } // 強連結成分番号 std::vector get_cmp(){ return cmp; } // 同じ辺を2度通らない、その頂点までの最長経路 std::vector depth(){ scc(); std::vector> order; std::vector dp(V, 1); for(int i=0; i> G[100005]; ll dp1[100005]; ll dp2[100005]; int main(){ int N, M; cin >> N >> M; SCC scc(N+1); rep(i,M){ ll a, b, c, d; cin >> a >> b >> c >> d; scc.add_edge(a,b); G[a].push_back({b, c % MOD, d % MOD}); } scc.scc(); if(scc.iscyclic()){ cout << "INF" << endl; return 0; } vector cmp = scc.get_cmp(); vector> order; for(int i=0; i