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 = 1010;
const int N = 1e5 + 10;
struct node {
  int v;
  long long cost;
  node(int vi = 0, long long ci = 0) : v(vi), cost(ci) {}
};
vector<node> vec[2][MAXN];
void addedge(int id, int u, int v, long long w) {
  vec[id][u].push_back(node(v, w));
}
int vis[MAXN];
long long dist[MAXN];
int L[N], R[N];
long long V[MAXN][MAXN];
int fa[N];
bool spfa(int id, int start, int n) {
  memset(vis, 0, sizeof(vis));
  for (int i = 0; i < n; i++) dist[i] = 0x3f3f3f3f, fa[i] = i;
  vis[start] = 1, dist[start] = 0;
  queue<int> que;
  while (!que.empty()) que.pop();
  que.push(start);
  while (!que.empty()) {
    int u = que.front();
    que.pop();
    vis[u] = 0;
    for (int i = 0; i < vec[id][u].size(); i++) {
      int v = vec[id][u][i].v;
      long long w = V[u][v];
      if (dist[v] > dist[u] + abs(w)) {
        dist[v] = dist[u] + abs(w);
        fa[v] = u;
        if (!vis[v]) {
          vis[v] = 1;
          que.push(v);
        }
      }
    }
  }
  return true;
}
void FUZHI(int n, int m, int s, int t, int l) {
  int x = t, flag = 0;
  while (1) {
    int y = fa[x];
    if (V[x][y] == -1) {
      V[x][y] = V[y][x] = -2;
    }
    if (y == fa[y]) break;
    x = y;
  }
  for (int i = 0; i < n; i++) {
    for (int j = 0; j < n; j++) {
      if (V[i][j] == -1) V[i][j] = 0x3f3f3f3f;
    }
  }
  x = t;
  while (1) {
    int y = fa[x];
    if (V[x][y] == -2) {
      V[x][y] = V[y][x] = -1;
    }
    if (y == fa[y]) break;
    x = y;
  }
}
bool solve(int n, int s, int t, int l) {
  spfa(0, s, n);
  int x = t, flag = 0;
  if (dist[t] == l) return true;
  while (1) {
    int y = fa[x];
    if (!flag && V[x][y] < 0) {
      long long w = abs(V[x][y]);
      V[x][y] = V[y][x] = w + l - dist[t];
      flag = 1;
    }
    if (y == fa[y]) break;
    x = y;
  }
  return false;
}
int main() {
  int n, m, l, s, t;
  scanf("%d%d%d%d%d", &n, &m, &l, &s, &t);
  for (int i = 0; i < m; i++) {
    int u, v;
    long long w;
    scanf("%d%d%I64d", &u, &v, &w);
    if (w) {
      addedge(1, u, v, w);
      addedge(1, v, u, w);
    }
    if (w == 0) w = -1;
    addedge(0, u, v, w);
    addedge(0, v, u, w);
    L[i] = u, R[i] = v;
    V[u][v] = V[v][u] = w;
  }
  spfa(1, s, n);
  if (dist[t] < l) {
    printf("NO\n");
    return 0;
  }
  if (dist[t] == l) {
    printf("YES\n");
    for (int i = 0; i < m; i++) {
      int u = L[i], v = R[i];
      long long w = V[u][v];
      if (w == -1) w = 0x3f3f3f3f;
      printf("%d %d %I64d\n", u, v, w);
    }
    return 0;
  }
  spfa(0, s, n);
  FUZHI(n, m, s, t, l);
  if (dist[t] > l) {
    printf("NO\n");
    return 0;
  }
  solve(n, s, t, l);
  while (!solve(n, s, t, l)) solve(n, s, t, l);
  printf("YES\n");
  for (int i = 0; i < m; i++) {
    int u = L[i], v = R[i];
    long long w = V[u][v];
    if (w < 0) w = -w;
    printf("%d %d %I64d\n", u, v, w);
  }
  return 0;
}
