7 9 999999999 0 3
0 1 0
1 2 0
2 3 0
0 4 1
4 1 1
1 5 499999999
5 2 499999999
2 6 1
6 3 1
 7 9 320 0 3
0 1 0
1 2 0
2 3 0
0 4 1
4 1 1
1 5 100
5 2 100
2 6 59
6 3 61
 4 5 7 0 3
0 1 0
1 2 3
2 3 0
0 2 5
1 3 5
 8 9 10 1 0
1 2 1
2 4 1
1 3 0
3 4 0
4 5 0
5 6 1
6 0 1
5 7 0
7 0 0
 4 4 14 1 3
1 3 13
2 3 0
2 0 0
1 0 12
 5 6 1000000000 0 4
0 1 1
2 0 2
3 0 3
4 1 0
4 2 0
3 4 0
 4 5 10 1 2
0 1 3
1 2 0
1 3 4
2 3 4
2 0 6
 4 4 2 1 3
1 3 13
2 3 0
2 0 0
1 0 0
 5 5 2 0 2
0 1 1
1 2 1
0 4 0
4 3 0
3 2 0
 5 5 3 0 2
0 1 1
1 2 1
0 4 0
4 3 0
3 2 0
 4 4 8 1 3
1 3 13
2 3 0
2 0 0
1 0 6
 1000 1 1000000000 998 0
0 999 0
 5 5 1 0 2
0 1 1
1 2 1
0 4 0
4 3 0
3 2 0
 100 1 123456 99 0
0 99 123456
 4 4 13 1 3
1 3 13
2 3 0
2 0 0
1 0 12
 7 9 319 0 3
0 1 0
1 2 0
2 3 0
0 4 1
4 1 1
1 5 100
5 2 100
2 6 59
6 3 61
 1000 1 5 999 0
0 999 0

YES
0 1 1
1 2 999999996
2 3 999999997
0 4 1
4 1 1
1 5 499999999
5 2 499999999
2 6 1
6 3 1
 YES
0 1 1
1 2 199
2 3 318
0 4 1
4 1 1
1 5 100
5 2 100
2 6 59
6 3 61
 YES
0 1 3
1 2 3
2 3 2
0 2 5
1 3 5
 YES
1 2 1
2 4 1
1 3 1
3 4 1
4 5 6
5 6 1
6 0 1
5 7 1
7 0 1
 NO YES
0 1 1
2 0 2
3 0 3
4 1 999999999
4 2 999999998
3 4 999999997
 NO NO YES
0 1 1
1 2 1
0 4 1
4 3 1
3 2 1
 NO YES
1 3 13
2 3 1
2 0 1
1 0 6
 NO NO YES
0 99 123456
 YES
1 3 13
2 3 1
2 0 1
1 0 12
 YES
0 1 1
1 2 198
2 3 317
0 4 1
4 1 1
1 5 100
5 2 100
2 6 59
6 3 61
 YES
0 999 5

import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.Arrays;
import java.util.StringTokenizer;


public class D {

	static StringTokenizer st;
	static BufferedReader br;
	static PrintWriter pw;
	static int[][]a;
	static int[][]b;
	static long[]d;
	static int n;
	public static void main(String[] args) throws IOException {
		br = new BufferedReader(new InputStreamReader(System.in));
		pw = new PrintWriter(new BufferedWriter(new OutputStreamWriter(System.out)));
		n = nextInt();
		int m = nextInt();
		int L = nextInt();
		int s = nextInt();
		int t = nextInt();
		s++;
		t++;
		a = new int[n+1][n+1];
		b = new int[n+1][n+1];
		for (int i = 1; i <= m; i++) {
			int v1 = nextInt();
			int v2 = nextInt();
			v1++;
			v2++;
			int w = nextInt();
			if (w==0)
				w = -1;
			b[v1][v2] = b[v2][v1] = w; 
		}
		d = new long[n+1];
		int left = 0, right = (int) (1e9+7);
		while (right-left > 1) {
			int mid = (left+right) >> 1;
			long shortes = Dikstra(mid, s, t);
			if (shortes > L)
				right = mid;
			else
				left = mid;
		}
		if (left==0) {
			System.out.println("NO");
			return;
		}
		Dikstra(left+1, s, t);
		long[]d1 = new long[n+1];
		d1 = d.clone();
		Dikstra(left, t, s);
		long[]d2 = new long[n+1];
		d2 = d.clone();
		pw.println("YES");
		for (int i = 1; i <= n; i++) {
			for (int j = i+1; j <= n; j++) {
				if (b[i][j] != 0) {
					if (b[i][j] != -1)
						pw.println((i-1)+" "+(j-1)+" "+b[i][j]);
					else {
						if (d1[i]+left+d2[j] >= L) {
							pw.println((i-1)+" "+(j-1)+" "+(left));
							for (int j2 = 1; j2 <= n; j2++) {
								d1[j2] = Math.min(d1[j2], d1[i]+d2[j]+left);
								d1[j2] = Math.min(d1[j2], d1[j]+d2[i]+left);
								
								d2[j2] = Math.min(d2[j2], d1[i]+d2[j]+left);
								d2[j2] = Math.min(d2[j2], d1[j]+d2[i]+left);
							}
						}
						else {
							pw.println((i-1)+" "+(j-1)+" "+(left+1));
						}
					}
				}
			}
		}
		pw.close();
	}
	private static long Dikstra(int x, int s, int t) {
		for (int i = 1; i <= n; i++) {
			for (int j = 1; j <= n; j++) {
				a[i][j] = b[i][j];
				if (b[i][j]==-1)
					a[i][j] = x;
			}
		}
		long INF = (long) 1e18;
		Arrays.fill(d, INF);
		d[s] = 0;
		boolean[]used = new boolean[n+1];
		for (int it = 1; it <= n; it++) {
			int v = 0;
			for (int i = 1; i <= n; i++) {
				if (!used[i] && (v==0 || d[i] < d[v]))
					v = i;
			}
			used[v] = true;
			for (int i = 1; i <= n; i++) {
				if (a[v][i] != 0)
					d[i] = Math.min(d[i], d[v] + a[v][i]);
			}
		}
		return d[t];
	}
	private static int nextInt() throws IOException {
		return Integer.parseInt(next());
	}
	private static long nextLong() throws IOException {
		return Long.parseLong(next());
	}
	private static double nextDouble() throws IOException {
		return Double.parseDouble(next());
	}
	private static String next() throws IOException {
		while (st==null || !st.hasMoreTokens())
			st = new StringTokenizer(br.readLine());
		return st.nextToken();
	}
}