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;
long long n, m;
long long L, s, t;
long long tav[1001];
long long honnan[1001];
bool volt[1001];
vector<pair<long long, long long>> g[1001];
struct lehetoseg {
  long long ki, honnan, tav;
  lehetoseg(long long bki, long long bhonnan, long long btav) {
    ki = bki;
    honnan = bhonnan;
    tav = btav;
  }
  bool operator<(const lehetoseg& masik) const { return tav > masik.tav; }
};
priority_queue<lehetoseg> sor;
vector<pair<pair<long long, long long>, long long>> elek;
map<pair<long long, long long>, bool> van_kozte_meghatarozatlan, uton_van;
int main() {
  cin >> n >> m >> L >> s >> t;
  sor.push(lehetoseg(s, s, 0));
  for (long long i = 1; i <= m; i++) {
    long long a, b, c;
    cin >> a >> b >> c;
    if (c == 0) {
      van_kozte_meghatarozatlan[make_pair(a, b)] = true;
      van_kozte_meghatarozatlan[make_pair(b, a)] = true;
    }
    elek.push_back(make_pair(make_pair(a, b), c));
    g[a].push_back(make_pair(b, c));
    g[b].push_back(make_pair(a, c));
  }
  sor.push(lehetoseg(s, s, 0));
  while (sor.size() > 0) {
    auto lehet = sor.top();
    sor.pop();
    if (volt[lehet.ki]) continue;
    tav[lehet.ki] = lehet.tav;
    honnan[lehet.ki] = lehet.honnan;
    volt[lehet.ki] = true;
    for (auto szomszi : g[lehet.ki]) {
      if (!volt[szomszi.first] && szomszi.second > 0) {
        sor.push(
            lehetoseg(szomszi.first, lehet.ki, lehet.tav + szomszi.second));
      }
    }
  }
  if (volt[t] && tav[t] < L) {
    cout << "NO";
    return 0;
  }
  if (volt[t] && tav[t] == L) {
    cout << "YES\n";
    for (auto el : elek) {
      cout << el.first.first << " " << el.first.second << " "
           << (el.second > 0 ? el.second : 1) << endl;
    }
    return 0;
  }
  for (long long i = 0; i < n; i++) volt[i] = false;
  sor.push(lehetoseg(s, s, 0));
  while (sor.size() > 0) {
    auto lehet = sor.top();
    sor.pop();
    if (volt[lehet.ki]) continue;
    tav[lehet.ki] = lehet.tav;
    honnan[lehet.ki] = lehet.honnan;
    volt[lehet.ki] = true;
    for (auto szomszi : g[lehet.ki]) {
      if (!volt[szomszi.first]) {
        sor.push(lehetoseg(szomszi.first, lehet.ki,
                           lehet.tav + szomszi.second + (szomszi.second == 0)));
      }
    }
  }
  if (!volt[t] || tav[t] > L) {
    cout << "NO";
    return 0;
  }
  long long holtartok = t;
  long long holtartokvaloban = holtartok;
  while (honnan[holtartokvaloban] != holtartokvaloban) {
    if (van_kozte_meghatarozatlan[make_pair(holtartokvaloban,
                                            honnan[holtartokvaloban])]) {
      holtartok = holtartokvaloban;
      uton_van[make_pair(holtartokvaloban, honnan[holtartokvaloban])] = true;
      uton_van[make_pair(honnan[holtartokvaloban], holtartokvaloban)] = true;
    }
    holtartokvaloban = honnan[holtartokvaloban];
  }
  long long kelloda = L - tav[t] + 1;
  cout << "YES\n";
  for (auto el : elek) {
    if (el.second > 0)
      cout << el.first.first << " " << el.first.second << " " << el.second
           << endl;
    else {
      if ((holtartok == el.first.first &&
           honnan[holtartok] == el.first.second) ||
          (holtartok == el.first.second && honnan[holtartok] == el.first.first))
        cout << el.first.first << " " << el.first.second << " " << kelloda
             << endl;
      else
        cout << el.first.first << " " << el.first.second << " "
             << (uton_van[make_pair(el.first.first, el.first.second)] ? 1
                                                                      : INT_MAX)
             << endl;
    }
  }
  return 0;
}
