#include <bits/stdc++.h>
using namespace std;
const long long INF = 10000000000000000;
const long long maxM = 100000 + 10;
long long d1;
bool er[maxM];
vector<long long> paths1;
struct Edge {
  long long from, to;
  long long dist;
};
struct HeapNode {
  long long d;
  long long u;
  bool operator<(const HeapNode& rhs) const { return d > rhs.d; }
};
vector<Edge> edges;
vector<long long> G[maxM];
bool done[maxM];
long long d[maxM];
long long p[maxM];
long long id[maxM];
struct Dijkstra {
  long long n, m;
  void init(long long n) {
    this->n = n;
    for (long long i = 0; i < n; i++) G[i].clear();
    edges.clear();
  }
  void AddEdge(long long from, long long to, long long dist, long long ff) {
    edges.push_back((Edge){from, to, dist});
    m = edges.size();
    G[from].push_back(m - 1);
    id[m - 1] = ff;
  }
  void dijkstra(long long s) {
    priority_queue<HeapNode> Q;
    for (long long i = 0; i < n; i++) d[i] = INF;
    d[s] = 0;
    memset(done, 0, sizeof(done));
    Q.push((HeapNode){0, s});
    while (!Q.empty()) {
      HeapNode x = Q.top();
      Q.pop();
      long long u = x.u;
      if (done[u]) continue;
      done[u] = true;
      for (long long i = 0; i < G[u].size(); i++) {
        Edge& e = edges[G[u][i]];
        if (d[e.to] > d[u] + e.dist) {
          d[e.to] = d[u] + e.dist;
          p[e.to] = G[u][i];
          Q.push((HeapNode){d[e.to], e.to});
        }
      }
    }
  }
  void GetShortestPaths(long long s, long long u) {
    dijkstra(s);
    if (d[u] >= INF) {
      d1 = d[u];
      return;
    }
    for (long long i = u; i <= u; i++) {
      d1 = d[i];
      paths1.clear();
      long long t = i;
      paths1.push_back(t);
      while (t != s) {
        paths1.push_back(edges[p[t]].from);
        t = edges[p[t]].from;
      }
      reverse(paths1.begin(), paths1.end());
    }
  }
};
Dijkstra solver;
Edge ei[maxM];
int main() {
  long long n, m, s, t;
  long long L;
  while (~scanf("%lld%lld%lld%lld%lld", &n, &m, &L, &s, &t)) {
    memset(er, 0, sizeof(er));
    for (long long i = 0; i < m; i++) {
      scanf("%lld%lld%lld", &ei[i].from, &ei[i].to, &ei[i].dist);
      if (ei[i].dist == 0) er[i] = 1;
    }
    solver.init(n);
    for (long long i = 0; i < m; i++) {
      if (er[i]) ei[i].dist = L;
      solver.AddEdge(ei[i].from, ei[i].to, ei[i].dist, 0);
      solver.AddEdge(ei[i].to, ei[i].from, ei[i].dist, 0);
    }
    solver.GetShortestPaths(s, t);
    if (d1 < L)
      printf("NO\n");
    else if (d1 == L) {
      printf("YES\n");
      for (long long i = 0; i < m; i++)
        printf("%lld %lld %lld\n", ei[i].from, ei[i].to, ei[i].dist);
    } else {
      solver.init(n);
      for (long long i = 0; i < m; i++) {
        if (er[i]) {
          ei[i].dist = 1;
          solver.AddEdge(ei[i].from, ei[i].to, ei[i].dist, i + 1);
          solver.AddEdge(ei[i].to, ei[i].from, ei[i].dist, i + 1);
        } else {
          solver.AddEdge(ei[i].from, ei[i].to, ei[i].dist, 0);
          solver.AddEdge(ei[i].to, ei[i].from, ei[i].dist, 0);
        }
      }
      solver.GetShortestPaths(s, t);
      if (d1 > L)
        printf("NO\n");
      else if (d1 == L) {
        printf("YES\n");
        for (long long i = 0; i < m; i++)
          printf("%lld %lld %lld\n", ei[i].from, ei[i].to, ei[i].dist);
      } else {
        for (;;) {
          long long add = L - d1;
          for (long long i = 0; i < paths1.size(); i++) {
            long long u = paths1[i];
            bool ok = false;
            for (long long j = 0; j < G[u].size(); j++) {
              long long ee = G[u][j];
              if (id[ee] && edges[ee].to == paths1[i + 1]) {
                edges[ee].dist += add;
                ei[id[ee] - 1].dist = edges[ee].dist;
                ok = true;
                break;
              }
            }
            if (ok) break;
          }
          solver.GetShortestPaths(s, t);
          if (d1 < L) continue;
          printf("YES\n");
          for (long long i = 0; i < m; i++) {
            printf("%lld %lld %lld\n", ei[i].from, ei[i].to, ei[i].dist);
          }
          break;
        }
      }
    }
  }
  return 0;
}
