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>
using namespace std;
const long long MAX = 1005;
const long long INF = 1e9 + 10;
const long long BIGINF = 1e18;
long long par[MAX];
vector<pair<long long, long long>> g[MAX];
set<pair<long long, long long>> edges;
long long dijkstra(long long src, long long trg) {
  vector<long long> d(MAX, BIGINF);
  memset(par, -1, sizeof(par));
  d[src] = 0;
  set<pair<long long, long long>> s;
  s.insert({0LL, src});
  while (s.size()) {
    long long u = s.begin()->second;
    s.erase(s.begin());
    for (auto e : g[u]) {
      long long v = e.first;
      long long w = e.second;
      if (d[v] > d[u] + w) {
        s.erase({d[v], v});
        d[v] = d[u] + w, par[v] = u;
        s.insert({d[v], v});
      }
    }
  }
  return d[trg];
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  long long n, m, L, s, t;
  cin >> n >> m >> L >> s >> t;
  vector<vector<long long>> all;
  for (long long i = 0; i < m; i++) {
    long long u, v, w;
    cin >> u >> v >> w;
    all.push_back({u, v, w});
    if (w == 0)
      edges.insert({u, v});
    else {
      g[u].push_back({v, w});
      g[v].push_back({u, w});
    }
  }
  long long dist = dijkstra(s, t);
  if (dist < L) return cout << "NO", 0;
  for (auto &e : edges) {
    long long u = e.first, v = e.second;
    g[u].push_back({v, 1});
    g[v].push_back({u, 1});
  }
  dist = dijkstra(s, t);
  if (dist > L) return cout << "NO", 0;
  if (dist == L) {
    cout << "YES\n";
    for (auto &e : all) {
      long long u = e[0], v = e[1], w = e[2];
      cout << u << " " << v << " " << max(1LL, w) << "\n";
    }
  } else {
    set<pair<long long, long long>> temp;
    long long x = -1, y = -1, w = -1;
    long long cx = par[t], cy = t;
    while (true) {
      temp.insert({cx, cy});
      temp.insert({cy, cx});
      if ((edges.find({cx, cy}) != edges.end() ||
           edges.find({cy, cx}) != edges.end()) &&
          x == -1)
        x = cx, y = cy;
      if (cx <= 0) break;
      cy = par[cy];
      cx = par[cx];
    }
    cout << "YES\n";
    for (auto &e : all) {
      long long u = e[0], v = e[1], w = e[2];
      if (w > 0)
        cout << u << " " << v << " " << w << "\n";
      else {
        if ((u == x && v == y) || (u == y && v == x))
          cout << u << " " << v << " " << L + 1 - dist << "\n";
        else if (temp.find({u, v}) != temp.end())
          cout << u << " " << v << " 1\n";
        else
          cout << u << " " << v << " " << BIGINF << "\n";
      }
    }
  }
  return 0;
}
