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 int maxn = 10010;
int n, m, l, s, t;
int head1[maxn], val1[maxn], size1, point1[maxn], nxt1[maxn], vis1[maxn];
long long int dist1[maxn];
struct node {
  int a, b, c;
} q[100010];
struct node1 {
  int a, b, c, val;
} p[100010];
void add(int a, int b, int v) {
  point1[size1] = b;
  val1[size1] = v;
  nxt1[size1] = head1[a];
  head1[a] = size1++;
  ;
  point1[size1] = a;
  val1[size1] = v;
  nxt1[size1] = head1[b];
  head1[b] = size1++;
  ;
}
void spfa(int s) {
  memset(vis1, 0, sizeof(vis1));
  memset(dist1, -1, sizeof(dist1));
  queue<int> q;
  vis1[s] = 1;
  dist1[s] = 0;
  q.push(s);
  while (!q.empty()) {
    int u = q.front();
    q.pop();
    vis1[u] = 0;
    for (int i = head1[u]; ~i; i = nxt1[i]) {
      int j = point1[i];
      if (dist1[j] == -1 || dist1[j] > dist1[u] + val1[i]) {
        dist1[j] = dist1[u] + val1[i];
        if (!vis1[j]) {
          q.push(j);
          vis1[j] = 1;
        }
      }
    }
  }
}
int main() {
  int i, j;
  while (scanf("%d%d%d%d%d", &n, &m, &l, &s, &t) != EOF) {
    memset(head1, -1, sizeof(head1));
    size1 = 0;
    int j = 1, k = 1;
    for (i = 1; i <= m; i++) {
      int a, b, c;
      cin >> a >> b >> c;
      if (c != 0) {
        q[k].a = a;
        q[k].b = b;
        q[k++].c = c;
        add(a, b, c);
      } else {
        p[j].a = a;
        p[j].b = b;
        p[j].val = j;
        p[j++].c = c;
      }
    }
    spfa(s);
    int flag = 0;
    if (dist1[t] < l && dist1[t] > 0)
      flag = 1;
    else if (dist1[t] == l)
      flag = 2;
    int pos = -1;
    for (i = 1; i < j; i++) {
      add(p[i].a, p[i].b, 1);
      spfa(s);
      if (dist1[t] > l || dist1[t] == -1) continue;
      pos = p[i].val;
      break;
    }
    if (flag == 2) {
      cout << "YES\n";
      for (i = 1; i <= m; i++) {
        if (q[i].c != 0)
          cout << q[i].a << " " << q[i].b << " " << q[i].c << endl;
        else
          cout << q[i].a << " " << q[i].b << " " << 1000000000000000000 << endl;
      }
    } else if (pos == -1 || flag == 1)
      cout << "NO\n";
    else {
      cout << "YES\n";
      for (i = 1; i < k; i++) {
        if (q[i].c != 0)
          cout << q[i].a << " " << q[i].b << " " << q[i].c << endl;
        else
          cout << q[i].a << " " << q[i].b << " " << 1000000000000000000 << endl;
      }
      for (i = 1; i < pos; i++) {
        cout << p[i].a << " " << p[i].b << " " << 1 << endl;
      }
      cout << p[i].a << " " << p[i].b << " " << l - dist1[t] + 1 << endl;
      for (i = pos + 1; i < k; i++) {
        cout << p[i].a << " " << p[i].b << " " << 1000000000000000000 << endl;
      }
    }
  }
  return 0;
}
