#include <bits/stdc++.h>
using namespace std;
struct edge {
  int u, v;
  int w;
  int other(int node) { return (u == node) ? v : u; }
};
int n, m, second, e;
int used[1003], parent[1003];
edge E[10004];
int dis[1003];
int L;
vector<int> g[1003];
void djkstra(int second, int e) {
  priority_queue<pair<int, int>, vector<pair<int, int> >,
                 greater<pair<int, int> > >
      Q;
  for (int i = 0; i < n; i++) {
    dis[i] = (2000000000 >> 1) + 1;
    used[i] = 0;
  }
  dis[second] = 0;
  Q.push(make_pair(0, second));
  while (!Q.empty() && (!used[e])) {
    pair<int, int> cur = Q.top();
    Q.pop();
    used[cur.second] = 1;
    for (int i = 0; i < g[cur.second].size(); i++) {
      int idx = g[cur.second][i];
      int to = E[idx].other(cur.second);
      if (!used[to] && E[idx].w + dis[cur.second] < dis[to]) {
        dis[to] = E[idx].w + dis[cur.second];
        Q.push(make_pair(dis[to], to));
        parent[to] = idx;
      }
    }
  }
}
bool cmp(edge e1, edge e2) { return e1.w > e2.w; }
int main() {
  scanf("%d", &n);
  scanf("%d", &m);
  scanf("%d", &L);
  scanf("%d", &second);
  scanf("%d", &e);
  for (int i = 1; i <= m; i++) {
    scanf("%d", &E[i].u);
    scanf("%d", &E[i].v);
    scanf("%d", &E[i].w);
  }
  sort(E + 1, E + m + 1, cmp);
  int last = 0;
  for (int i = 1; i <= m; i++) {
    if (E[i].w == 0) break;
    g[E[i].u].push_back(i);
    g[E[i].v].push_back(i);
    last = i;
  }
  djkstra(second, e);
  if (dis[e] < L) {
    puts("NO");
    return 0;
  }
  for (int i = last + 1; i <= m; i++) {
    E[i].w = 1;
    g[E[i].u].push_back(i);
    g[E[i].v].push_back(i);
  }
  djkstra(second, e);
  if (dis[e] > L) {
    puts("NO");
    return 0;
  }
  puts("YES");
  for (int i = last + 1; i <= m; i++) {
    E[i].w = L;
  }
  int node = e;
  while (node != second) {
    int idx = parent[node];
    if (idx > last) {
      E[idx].w = 1;
    }
    node = E[idx].other(node);
  }
  while (dis[e] < L) {
    node = e;
    while (node != second) {
      int idx = parent[node];
      if (idx > last) {
        E[idx].w += (L - dis[e]);
        break;
      }
      node = E[idx].other(node);
    }
    djkstra(second, e);
  }
  for (int i = 1; i <= m; i++) {
    printf("%d %d %d\n", E[i].u, E[i].v, E[i].w);
  }
  return 0;
}
