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

#include<queue>
#include<iostream>
#include<cstdio>
#include<cstdlib>
using namespace std;

#define inf (1LL<<50)
#define maxn (1010)
#define maxm (20010)
typedef long long ll;
int N,M,L,S,T,side[maxn],toit[maxm],next[maxm],len[maxm],cnt = 1;
ll dis[maxn]; bool vis[maxn]; int way[maxn],num;

inline void add(int a,int b,int c) {  next[++cnt] = side[a]; side[a] = cnt; toit[cnt] = b; len[cnt] = c; }
inline void ins(int a,int b,int c) { add(a,b,c); add(b,a,c); }

inline void spfa()
{
	queue <int> team; team.push(S);
	for (int i = 0;i < N;++i) dis[i] = inf;
	dis[S] = 0; vis[S] = true;
	while (!team.empty())
	{
		int now = team.front(); team.pop();
		for (int i = side[now];i;i = next[i])
			if (dis[toit[i]] > dis[now]+((!len[i])?1:len[i]))
			{
				dis[toit[i]] = dis[now]+((!len[i])?1:len[i]);
				if (!vis[toit[i]]) vis[toit[i]] = true,team.push(toit[i]);
			}
		vis[now] = false;
	}
}

inline void find(int now)
{
	if (vis[now]) return;
	vis[now] = true;
	if (vis[T]) return;
	for (int i = side[now];i;i = next[i])
		if (dis[toit[i]] == dis[now]+((!len[i])?1:len[i]))
		{
			way[++num] = i;
			find(toit[i]);
			if (vis[T]) return;
			--num;
		}
}

int main()
{
	//freopen("D.in","r",stdin);
	//freopen("D.out","w",stdout);
	scanf("%d %d %d %d %d",&N,&M,&L,&S,&T);
	for (int i = 1,a,b,c;i <= M;++i) scanf("%d %d %d",&a,&b,&c),ins(a,b,c);
	spfa();
	if (dis[T] > L) printf("NO");
	else
	{
		for (int i = 0;i < N;++i) vis[i] = false;
		find(S);
		bool sign = false;
		for (int i = 1;i <= num;++i) if (!len[way[i]]) { sign = true; break; }
		if (sign)
		{
			printf("YES\n");
			for (int i = 1;i <= num;++i) if (!len[way[i]]) { len[way[i]] = len[way[i]^1] = L-dis[T]+1; break; }
			for (int i = 1;i <= num;++i) if (!len[way[i]]) len[way[i]] = len[way[i]^1] = 1;
			for (int i = 2;i <= cnt;++i) if (!len[i]) len[i] = 1<<30;
			for (int i = 2;i <= cnt;i += 2) printf("%d %d %d\n",toit[i^1],toit[i],len[i]);
		}
		else printf("NO\n");
	}
	//fclose(stdin); fclose(stdout);
	return 0;
}
