#include<iostream> #include<vector> #include<queue> #include<cstring> usingnamespace std; #define ll long long constint maxn = 1e5 + 5; constint INF = 1e6; int n, m; structEdge { int from, to, dist; };
vector<Edge>edges; vector<int>G[maxn]; bool inq[maxn]; ll d[maxn], p[maxn], cnt[maxn]; voidinit(int n){ for (int i = 1; i <= n; i++) { G[i].clear(); } edges.clear(); } voidadd_edge(int from, int to, int dist){ edges.push_back(Edge{ from,to,dist }); G[from].push_back(edges.size() - 1); } boolnegacycle(int x){ queue<int>Q; memset(inq, 0, sizeof(inq)); memset(cnt, 0, sizeof(cnt)); for (int i = 1; i <= n; i++) { d[i] = 0; inq[i] = true; Q.push(i); } while (!Q.empty()) { int u = Q.front(); Q.pop(); inq[u] = false; for (int i = 0; i < G[u].size(); i++) { Edge& e = edges[G[u][i]]; if (d[e.to] > d[u] + e.dist - x) { d[e.to] = d[u] + e.dist - x; p[e.to] = G[u][i]; if (!inq[e.to]) { Q.push(e.to); inq[e.to] = true; if (++cnt[e.to] > n)returntrue; } } } } returnfalse; }
int l, r; intmain(){
while (cin >> n >> m) { init(n); for (int i = 0; i < m; i++) { int u, v, w; cin >> u >> v >> w; add_edge(u, v, w); } if (negacycle(1)) { cout << "No Solution" << endl; continue; } l = 1; r = 10010; while (l < r) { int mid = (l + r + 1) / 2; if (negacycle(mid))r = mid - 1; else l = mid; } if (l == 10010)cout << "Infinite" << endl; else cout << l << endl; } return0; }