#include #include #include #include #include using namespace std; typedef long long lint; typedef vectorvi; typedef pairpii; typedef tupletri; #define rep(i,n)for(int i=0;i<(int)(n);++i) const lint mod=1e9+7; const int N=100001; int n,m; vectorg[N]; //dp1:通り数,dp2:長さの合計 lint dp1[N],dp2[N]; bool inf[N]; int st[N]; void dfs(int v){ if(st[v]==1){ inf[v]=1; st[v]=2; return; } if(st[v]==2){ return; } st[v]=1; dp1[v]=v==n?1:0; for(tri wlk:g[v]){ int w,l,k; tie(w,l,k)=wlk; dfs(w); if(inf[w]){ inf[v]=1; }else{ dp1[v]=(dp1[v]+dp1[w]*k)%mod; dp2[v]=(dp2[v]+dp2[w]*k+dp1[w]*k%mod*l)%mod; } } st[v]=2; } int main(){ cin>>n>>m; rep(_,m){ int a,b,l,k;cin>>a>>b>>l>>k; g[a].push_back(tri(b,l,k)); } dfs(0); if(inf[0]){ cout<<"INF"<