#include using namespace std; #define int long long signed main(){ int n,m; cin >> n >> m; vector>> G(2*n),A(n); vector> GG(2*n); for (int i(1);i < n;++i) GG[i].emplace_back(i<<1),GG[i].emplace_back(i<<1|1); for (int i(0),a,b,c,d;i < m;++i){ cin >> a >> b >> c >> d; --a,--b; A[a].emplace_back(b,c); if (d) for (int l(n+b),r(n+c);l < r;l>>=1,r>>=1){ if (l&1) G[n+a].emplace_back(l++,d); if (r&1) G[n+a].emplace_back(--r,d); } else for (int l(n+b),r(n+c);l < r;l>>=1,r>>=1){ if (l&1) GG[n+a].emplace_back(l++); if (r&1) GG[n+a].emplace_back(--r); } } vector I(2*n),O(2*n,-1); int o = 0; for (int i(0);i < 2*n;++i) for (int k:GG[i]) ++I[k]; queue q; for (int i(0);i < 2*n;++i) if (I[i]==0) q.emplace(i); while(!q.empty()){ int x = q.front(); q.pop(),O[x] = o++; for (int y:GG[x]){ --I[y]; if (I[y]==0) q.emplace(y); } } auto f = [&O](pair& x,pair& y) -> bool { return (x.first==y.first?O[x.second]>O[y.second]:x.first>y.first); }; vector dist(2*n,1e18),dp(2*n),segtree(2*n,1); int r = 1; for (int i(n-1);i;--i) segtree[i] = segtree[i<<1]+segtree[i<<1|1]; priority_queue,vector>,decltype(f)> que(f); dist[n] = 0,dp[n] = 1,que.emplace(0,n); int t = 0; vector T; auto check = [](int x,int y) -> int { int t = 1e18; if (x>t||y>t||y>t/x) (cout<<"Too Many"<>=1) --segtree[k]; T.clear(); } if (b>=n) t = a,T.emplace_back(b-n); for (auto c:GG[b]){ if (dist[c]==a) dp[c] += dp[b]; if (dist[c]>a) dist[c] = a,dp[c] = dp[b],que.emplace(dist[c],c); } for (auto [c,d]:G[b]){ if (dist[c]==a+d) dp[c] += dp[b]; if (dist[c]>a+d) dist[c] = a+d,dp[c] = dp[b],que.emplace(dist[c],c); } if (b>=n) for (auto [ll,rr]:A[b-n]) for (ll+=n,rr+=n;ll < rr;ll>>=1,rr>>=1){ if (ll&1) r += check(segtree[ll++],dp[b]); if (rr&1) r += check(segtree[--rr],dp[b]); if (r>1e18) (cout<<"Too Many"<