#include #include #include #include using namespace std; int main() { int n, m, s, t; cin >> n >> m >> s >> t; vector>> out(2*n); vector>> in(2*n); vector dist(2*n, INT_MAX); vector done(2*n, false); vector outct(2*n, 0); for(int i = 0; i < m; i++) { int a, b, w; cin >> a >> b >> w; out[2*a].push_back(make_pair(2*b+1, w)); out[2*a+1].push_back(make_pair(2*b, w)); outct[2*a]++; outct[2*a + 1]++; in[2*b].push_back(make_pair(2*a+1, w)); in[2*b+1].push_back(make_pair(2*a, w)); } priority_queue, vector>, std::greater>> q; dist[2*t] = 0; dist[2*t + 1] = 0; q.push(make_pair(0, 2*t)); q.push(make_pair(0, 2*t + 1)); while(!q.empty()) { auto pair = q.top(); q.pop(); int cur = pair.second; if(done[cur]) continue; done[cur] = true; if(cur & 1) { dist[cur] = 0; for(auto out_pair : out[cur]) { int w = out_pair.second; int nb = out_pair.first; dist[cur] = max(dist[cur], dist[nb] + w); } for(auto in_pair : in[cur]) { int w = in_pair.second; int nb = in_pair.first; dist[nb] = min(dist[nb], dist[cur] + w); q.push(make_pair(dist[nb], nb)); } } else { for(auto in_pair : in[cur]) { int nb = in_pair.first; outct[nb]--; if(outct[nb] == 0) { q.push(make_pair(0, nb)); } } } } if(dist[2*s + 1] == INT_MAX) cout << "infinity" << endl; else cout << dist[2*s+1] << endl; return 0; }