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>
const int maxn = 1e5 + 10;
using namespace std;
long long gcd(long long p, long long q) { return q == 0 ? p : gcd(q, p % q); }
long long qpow(long long p, long long q) {
  long long f = 1;
  while (q) {
    if (q & 1) f = f * p;
    p = p * p;
    q >>= 1;
  }
  return f;
}
int n, m, k, t, len, s, h[maxn], tot, id, vis[maxn];
long long d[maxn];
vector<int> p[maxn], q[maxn];
struct node {
  int x, y, z;
} e[maxn];
void spfa() {
  int i, j;
  for (i = 0; i <= n - 1; i++) d[i] = 1e18;
  d[s] = 0;
  memset(vis, 0, sizeof vis);
  queue<int> pq;
  vis[s] = 1;
  pq.push(s);
  while (!pq.empty()) {
    int now = pq.front();
    pq.pop();
    vis[now] = 0;
    for (i = 0; i < p[now].size(); i++) {
      int to = p[now][i], ls = q[now][i];
      if (d[to] > d[now] + ls) {
        d[to] = d[now] + ls;
        if (!vis[to]) {
          vis[to] = 1;
          pq.push(to);
        }
      }
    }
  }
}
long long check(long long w) {
  int i, j;
  for (i = 0; i <= id - 1; i++) {
    e[h[i]].z = 1 + min(len + 1LL, w);
    w -= e[h[i]].z - 1;
  }
  for (i = 0; i <= n - 1; i++) p[i].clear(), q[i].clear();
  for (i = 1; i <= m; i++) {
    int x = e[i].x, y = e[i].y, z = e[i].z;
    p[x].push_back(y), q[x].push_back(z);
    p[y].push_back(x), q[y].push_back(z);
  }
  spfa();
  return d[t];
}
int main() {
  int i, j;
  scanf("%d%d%d%d%d", &n, &m, &len, &s, &t);
  for (i = 1; i <= m; i++) {
    scanf("%d%d%d", &e[i].x, &e[i].y, &e[i].z);
    if (!e[i].z) h[id++] = i;
  }
  long long l = 1, r = (long long)(len + 1) * id;
  if (check(0) > len || check(r) < len) return 0 * puts("NO");
  puts("YES");
  while (l <= r) {
    long long mid = l + r >> 1;
    if (check(mid) >= len)
      r = mid - 1;
    else
      l = mid + 1;
  }
  for (i = 1; i <= m; i++) printf("%d %d %d\n", e[i].x, e[i].y, e[i].z);
  return 0;
}
