#include <bits/stdc++.h>
using namespace std;
const long long inf = 1e15;
int n, m, s, t;
long long L;
long long dst[3][1007];
struct edge {
  int to;
  long long w;
  bool q;
  edge() {}
  edge(int to, long long w, bool q) : to(to), w(w), q(q) {}
};
vector<edge> adj[1007];
bool G[1007][1007];
void dijkstra(int x) {
  dst[1][x] = 0;
  priority_queue<pair<long long, int> > pq;
  pq.push(make_pair(0, x));
  while (!pq.empty()) {
    int u = pq.top().second;
    long long w = -pq.top().first;
    pq.pop();
    if (w != dst[1][u]) continue;
    for (auto b : adj[u]) {
      int v = b.to;
      long long dw = b.w;
      if (dst[1][v] > dst[1][u] + dw) {
        dst[1][v] = dst[1][u] + dw;
        pq.push(make_pair(-dst[1][v], v));
      }
    }
  }
}
void dijkstra1() {
  priority_queue<pair<long long, int> > pq;
  dst[0][s] = 0;
  pq.push(make_pair(0, s));
  while (!pq.empty()) {
    int u = pq.top().second;
    long long w = -pq.top().first;
    pq.pop();
    if (dst[0][u] != w) continue;
    for (int i = 0; i < adj[u].size(); i++) {
      int v = adj[u][i].to;
      long long nw = adj[u][i].w;
      bool e = adj[u][i].q;
      if (G[u][v]) continue;
      if (e) {
        if (L - dst[1][v] - w <= 0)
          adj[u][i].w = 1000000000;
        else
          adj[u][i].w = L - dst[1][v] - w;
        G[v][u] = 1;
        nw = adj[u][i].w;
      }
      if (dst[0][v] > dst[0][u] + nw) {
        dst[0][v] = dst[0][u] + nw;
        pq.push(make_pair(-dst[0][v], v));
      }
    }
  }
}
int main() {
  cin >> n >> m >> L >> s >> t;
  for (int i = 0; i < m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    bool q = 0;
    if (w == 0) {
      w = 1;
      q = 1;
    }
    adj[u].push_back(edge(v, w, q));
    adj[v].push_back(edge(u, w, q));
  }
  fill(dst[0], dst[0] + n + 1, inf);
  fill(dst[1], dst[1] + n + 1, inf);
  dijkstra(t);
  if (dst[1][s] > L) {
    printf("NO\n");
    return 0;
  }
  dijkstra1();
  fill(dst[1], dst[1] + n + 1, inf);
  dijkstra(s);
  if (dst[1][t] != L) {
    printf("NO\n");
    return 0;
  }
  printf("YES\n");
  for (int i = 0; i < n; i++) {
    for (auto x : adj[i]) {
      if (G[i][x.to]) continue;
      G[x.to][i] = 1;
      printf("%d %d %lld\n", i, x.to, x.w);
    }
  }
  return 0;
}
