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.*;
import java.util.*;

public class CF716D {
	static class E {
		int u, v, w;
		E(int u, int v, int w) {
			this.u = u;
			this.v = v;
			this.w = w;
		}
	}
	static class V {
		ArrayList<E> list = new ArrayList<>();
		int i, d;
		V(int i) {
			this.i = i;
		}
	}
	static void setw(ArrayList<E> list0, int w, int k) {
		int i = 0;
		for (E e : list0)
			e.w = i++ < k ? w + 1 : w;
	}
	static int dijkstra(V[] vv, int s, int t, int INF) {
		for (int i = 0; i < vv.length; i++)
			vv[i].d = INF;
		TreeSet<V> q = new TreeSet<>((u, v) -> u.d != v.d ? u.d - v.d : u.i - v.i);
		vv[s].d = 0;
		q.add(vv[s]);
		while (!q.isEmpty()) {
			V u = q.first();
			q.remove(u);
			if (u == vv[t])
				return u.d;
			for (E e : u.list) {
				V v = vv[e.u + e.v - u.i];
				int d = Math.min(u.d + e.w, INF);
				if (v.d > d) {
					q.remove(v);	// if (q.contains(v))
					v.d = d;
					q.add(v);
				}
			}
		}
		return INF;
	}
	public static void main(String[] args) throws IOException {
		BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
		StringTokenizer st = new StringTokenizer(br.readLine());
		int n = Integer.parseInt(st.nextToken());
		int m = Integer.parseInt(st.nextToken());
		int L = Integer.parseInt(st.nextToken());
		int s = Integer.parseInt(st.nextToken());
		int t = Integer.parseInt(st.nextToken());
		V[] vv = new V[n];
		for (int i = 0; i < n; i++)
			vv[i] = new V(i);
		ArrayList<E> list = new ArrayList<>();
		ArrayList<E> list0 = new ArrayList<>();
		int m0 = 0;
		while (m-- > 0) {
			st = new StringTokenizer(br.readLine());
			int u = Integer.parseInt(st.nextToken());
			int v = Integer.parseInt(st.nextToken());
			int w = Integer.parseInt(st.nextToken());
			E e = new E(u, v, w);
			vv[u].list.add(e);
			vv[v].list.add(e);
			list.add(e);
			if (w == 0) {
				list0.add(e);
				m0++;
			}
		}
		setw(list0, 1, 0);
		int d = dijkstra(vv, s, t, L + 1);
		if (d > L) {
			System.out.println("NO");
			return;
		}
		setw(list0, L + 1, 0);
		d = dijkstra(vv, s, t, L + 1);
		if (d < L) {
			System.out.println("NO");
			return;
		}
		if (m0 > 0) {
			long lower = 1 * m0 - 1, upper = (long) (L + 1) * m0, wk;
			int w, k;
			while (upper - lower > 1) {
				wk = (lower + upper) / 2;
				w = (int) (wk / m0);
				k = (int) (wk % m0);
				setw(list0, w, k);
				d = dijkstra(vv, s, t, L + 1);
				if (d < L)
					lower = wk;
				else if (d >= L)
					upper = wk;
			}
			wk = upper;
			w = (int) (wk / m0);
			k = (int) (wk % m0);
			setw(list0, w, k);
		}
		PrintWriter pw = new PrintWriter(System.out);
		pw.println("YES");
		for (E e : list)
			pw.println(e.u + " " + e.v + " " + e.w);
		pw.close();
	}
}
