import java.util.ArrayList;
import java.util.PriorityQueue;
import java.util.Scanner;
import java.lang.Math;

public class Hamster {
	static class Edge {
		int v; long weight;
		Edge(int v_, long w_) { v=v_; weight=w_; }
	}
	
	static class S {
		int u; boolean b;
		S(int u_, boolean b_) { u=u_; b=b_; }
	}

	static class PQ {
		long d; S v;
		PQ(long d_, S v_) { d=d_; v=v_; }
	}
	
	
	public static void main(String[] args) {
		
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int m = sc.nextInt();
		int s = sc.nextInt();
		int t = sc.nextInt();

		ArrayList<Edge>[] g = new ArrayList[n];
		int deg[] = new int[n];
		for(int i = 0; i < n; ++i)
			g[i] = new ArrayList();

		while(m-- != 0){
			int u = sc.nextInt();
			int v = sc.nextInt();
			int w = sc.nextInt();
			g[v].add(new Edge(u,w));
			++deg[u];
		}

		// Run modified Dijkstra.
		ArrayList<Long>[] dist = new ArrayList[2];
		dist[0] = new ArrayList(n);
		dist[1] = new ArrayList(n);
		long[] counts = new long[n];

		for(int i = 0; i < n; ++i){
			dist[0].add(1000000000000000000L);
			dist[1].add(0L);
		}

		PriorityQueue<PQ> pq = new PriorityQueue<PQ>((a,b) -> (int)Math.signum(a.d - b.d));
		dist[0].set(t, 0L);
		dist[1].set(t, 0L);
		pq.add(new PQ(0, new S(t, true)));
		pq.add(new PQ(0, new S(t, false)));
		long ans = -1;
		while(!pq.isEmpty())
		{				
			PQ cur = pq.remove();
			if(cur.v.u == s && cur.v.b == true){ 
				ans = cur.d;
				break;
			}
			if(cur.d != dist[cur.v.b ? 1 : 0].get(cur.v.u)) continue;
			if(cur.v.b){
				for(Edge e : g[cur.v.u])
					if(cur.d + e.weight < dist[0].get(e.v)){
						dist[0].set(e.v, cur.d+e.weight);
						pq.add(new PQ(cur.d+e.weight, new S(e.v, !cur.v.b)));
					}
			} else {
				for(Edge e : g[cur.v.u]){
					dist[1].set(e.v, Math.max(dist[1].get(e.v), cur.d + e.weight));
					++counts[e.v];
					if(counts[e.v] == deg[e.v])
						pq.add(new PQ(dist[1].get(e.v), new S(e.v, !cur.v.b)));
				}
			}
		}

		if(ans >= 0)
			System.out.println(ans);
		else
			System.out.println("infinity");
		
	}

}
