#include <bits/stdc++.h>
using namespace std;
double anss;
long long aans;
int cas, cass;
int n, m, lll, ans;
int S, T;
long long L;
int last[1004];
long long d[1004], dd[1004];
bool u[1004];
struct xxx {
  int from, to, next;
  long long q;
} a[10004 << 1];
bool cmp(int a, int b) { return d[a] > d[b]; }
void add(int x, int y, int z) {
  a[++lll].next = last[x];
  a[lll].from = x, a[lll].to = y;
  a[lll].q = z;
  last[x] = lll;
}
void dijkstra(bool f) {
  int i, j, k, now, to;
  long long q;
  memset(u, 0, sizeof(u));
  memset(d, 14, sizeof(d));
  if (f)
    d[S] = 0;
  else
    d[T] = 0;
  for (i = 0; i < n; i++) {
    for (j = 0, now = n; j < n; j++)
      if (!u[j] && d[now] > d[j]) now = j;
    u[now] = 1;
    for (j = last[now]; j; j = a[j].next) {
      to = a[j].to;
      if (f) {
        q = a[j].q;
        if (!q) q = max(L - d[now] - dd[to], 1ll);
        a[j].q = a[j ^ 1].q = q;
        d[to] = min(d[to], d[now] + a[j].q);
      } else if (a[j].q)
        d[to] = min(d[to], d[now] + a[j].q);
    }
  }
}
int main() {
  int i, j, k;
  int x, y, z;
  scanf("%d", &n);
  scanf("%d%I64d%d%d", &m, &L, &S, &T);
  lll = 1;
  memset(last, 0, sizeof(last));
  for (i = 1; i <= m; i++) {
    scanf("%d%d%d", &x, &y, &z);
    add(x, y, z), add(y, x, z);
  }
  dijkstra(0);
  if (d[S] < L) {
    puts("NO");
    return 0;
  }
  memcpy(dd, d, sizeof(dd));
  dijkstra(1);
  if (d[T] > L) {
    puts("NO");
    return 0;
  }
  puts("YES");
  for (i = 2; i <= m + m; i += 2)
    printf("%d %d %I64d\n", a[i].from, a[i].to, a[i].q);
  return 0;
}
