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 <bits/stdc++.h>
using namespace std;
void ga(int N, int *A) {
  for (int i(0); i < N; i++) scanf("%d", A + i);
}
long long cn[(1001)][(1001)];
pair<int, int> R[(1001)][(1001)];
struct eg {
  long long u, d, v, p, D;
  bool operator<(const eg &r) const { return d ^ r.d ? v > r.v : d > r.d; }
};
vector<pair<long long, long long> > g[(1001)];
map<pair<int, int>, int> Z;
int L, M, N, a, b, B[(100001)], E[(100001)], S, T, P[(100001)];
void dfs(int u, int d, long long p) {
  int U = R[u][d].first, D = R[u][d].second;
  if (!~U) return;
  if (D ^ d) P[Z[{u, U}]] = p, p = 0;
  dfs(U, D, p);
}
bool dj(int f, int T) {
  priority_queue<eg> q;
  q.push({f, 0, 0, -1, 0}), (memset(cn, -1, sizeof(cn)));
  while (!q.empty()) {
    long long a(q.top().u), d(q.top().d), w(q.top().v), p(q.top().p),
        z(q.top().D);
    cn[a][d] = w, R[a][d] = {p, z};
    if (a == T) {
      if (!d && w < L) return 0;
      if (w <= L) {
        for (int i(0); i < M; i++)
          if (!P[i]) P[i] = long long(2e9);
        dfs(a, d, L - w);
        puts("YES");
        for (int i(0); i < M; i++) printf("%d %d %d\n", B[i], E[i], P[i]);
        return 1;
      }
    }
    for (auto &h : g[a])
      if (h.second)
        q.push({h.first, d, w + h.second, a, d});
      else if (d + 1 < (1001))
        q.push({h.first, d + 1, w, a, d});
    while (!q.empty() && ~cn[q.top().u][q.top().d]) q.pop();
  }
  return 0;
}
int main(void) {
  scanf("%d%d%d%d%d", &N, &M, &L, &S, &T);
  for (int i(0); i < M; i++)
    scanf("%d%d%d", B + i, E + i, P + i), (g[B[i]].push_back({E[i], P[i]})),
        (g[E[i]].push_back({B[i], P[i]})),
        Z[{B[i], E[i]}] = Z[{E[i], B[i]}] = i;
  if (!dj(S, T)) puts("NO");
  return 0;
}
