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 <iostream>
#include <algorithm>
#include <complex>
#include <cstdlib>
#include <cstring>
#include <utility>
#include <bitset>
#include <cstdio>
#include <memory>
#include <string>
#include <vector>
#include <cmath>
#include <ctime>
#include <queue>
#include <stack>
#include <list>
#include <map>
#include <set>
using namespace std;
#define clr(ar,t) memset(ar, (t), sizeof(ar))
#define read() freopen("lol.txt", "r", stdin)
#define dbg(x) cout << #x << " = " << x << endl
#define lowbit(x) ( (x) & ( (x) ^ (x - 1) ) )

//typedef long long LL;
//typedef unsigned long long ULL;
typedef __int64 LL;
typedef unsigned __int64 ULL;

typedef pair<int, int> PII;
typedef pair<double, double> PDD;

typedef map<int, int>::iterator MI;
typedef vector<int>::iterator VI;
typedef list<LL>::iterator LI;
typedef set<int>::iterator SI;

const int INF_INT = 0x3f3f3f3f;
const LL INF_LL = 0x7fffffffffffffff;
const double oo = 10e9;
const double eps = 10e-7;
const double PI = acos(-1.0);

const int MAXN = 1100;
struct node{
    int to;
    LL w;
};
vector<node> v[MAXN];
int n,m,L,s,t;
map<pair<int,int>,int> mp;
LL d[MAXN];
int vis[MAXN];
int path[MAXN];
void spfa()
{
    queue<int> q;
    clr(vis,0);
    clr(path,-1);
    for(int i=0;i<n;i++) d[i]=INF_LL;
    d[s]=0;
    q.push(s);
    while(!q.empty())
    {
        int vv=q.front();q.pop();
        vis[vv]=0;
        for(int i=0;i<v[vv].size();i++)
        {
            int u=v[vv][i].to,w=v[vv][i].w;
            if(d[u]>d[vv]+w)
            {
                d[u]=d[vv]+w;
                path[u]=vv;
                if(!vis[u])
                {
                    q.push(u);vis[u]=1;
                }
            }
        }
    }
}
struct aans{
    int u;int v;int w;
}ans[10010];
int main()
{
    scanf("%d%d%d%d%d",&n,&m,&L,&s,&t);
    int f,tt,w;
    for(int i=0;i<m;i++)
    {
        scanf("%d%d%d",&f,&tt,&w);
        v[f].push_back(node{tt,w});
        v[tt].push_back(node{f,w});
        if(w==0)
        {
            mp[make_pair(f,tt)]=1;
            mp[make_pair(tt,f)]=1;
        }
        ans[i].u=f;ans[i].v=tt;ans[i].w=w;
    }
    spfa();
    if(d[t]>L)
    {
        printf("NO\n");return 0;
    }
    int q=t;
    int cnt=0;
    while(path[q]!=-1)
    {
        if(mp[make_pair(q,path[q])]==1)
            cnt++;
        q=path[q];
    }
    int c=L-d[t]-cnt;
    if(c<0)
    {
        printf("NO\n");return 0;
    }
    printf("YES\n");
    mp[make_pair(t,path[t])]+=c;
    mp[make_pair(path[t],t)]+=c;
    for(int i=0;i<m;i++)
    {
        if(ans[i].w != 0)
            printf("%d %d %d\n",ans[i].u,ans[i].v,ans[i].w);
        else
            printf("%d %d %d\n",ans[i].u,ans[i].v,mp[make_pair(ans[i].u,ans[i].v)]);
    }
}
