// #pragma GCC optimize("O3", "unroll-loops")
// #pragma GCC target("avx2", "bmi", "bmi2", "lzcnt", "popcnt")
#include <bits/stdc++.h>
#define ldb long double
//#define double ldb
#define db double
#define unomap unordered_map
#define unoset unordered_set
#define endl '\n'
#define str string
#define strstr stringstream
#define sz(a) (int)a.size()
#define ll long long
#define int ll
#define pii pair <int, int>
#define pll pair <ll, ll>
#define Unique(a) a.resize(unique(all(a)) - a.begin())
#define ull unsigned long long
#define fir first
#define sec second
#define idc cin.ignore()
#define lb lower_bound
#define ub upper_bound
#define all(s) s.begin(), s.end()
#define rall(s) s.rbegin(), s.rend()
#define rev reverse
#define gcd __gcd
#define pushb push_back
#define popb pop_back
#define pushf push_front
#define popf pop_front
#define emp emplace
#define empb emplace_back
#define mul2x(a, x) a << x
#define div2x(a, x) a >> x
#define lcm(a, b) (a / __gcd(a, b) * b)
#define log_base(x, base) log(x) / log(base)
#define debug cerr<<"No errors!",exit(0);
#define forw(i, a, b) for (int i = a; i <= b; ++i)
#define forw2(i, a, b) for (ll i = a; i <= b; ++i)
#define fors(i, a, b) for (int i = a; i >= b; --i)
#define fors2(i, a, b) for (ll i = a; i >= b; --i)
#define pqueue priority_queue
#define sqrt sqrtl
#define i128 __int128
#define popcount __builtin_popcountll
#define BIT(x, i) (((x) >> (i)) & 1)
#define MASK(x) ((1LL) << (x))
#define want_digit(x) cout << fixed << setprecision(x);
#define excuting_time 1000.0 * clock() / CLOCKS_PER_SEC
#define mapa make_pair
using namespace std;
const int MOD = 1e9 + 7; // 998244353;
const int inf = 1e9;
const ll INF = 1e18; // MASK(63) - 1
const int limN = 1e3 + 5;
const int limM = 1e4 + 5;
mt19937_64 rng(chrono::steady_clock::now().time_since_epoch().count());
inline ll random(const ll &L, const ll &R) {
return uniform_int_distribution<ll> (L, R) (rng);
}
template <class X, class Y>
bool minimize(X &x, const Y &y) {
return x > y ? x = y, true : false;
}
/* -------~~~~~~===== END OF TEMPLATE =====~~~~~~------- */
struct Edge {
int u, v, w;
Edge() {}
Edge(int _u, int _v, int _w): u(_u), v(_v), w(_w) {}
int other(int x) {
return x ^ u ^ v;
}
} edge[limM];
int n, m, L, s, t, par[limN], id[limN][limN];
ll d[limN];
vector <int> adj[limN];
void print() {
forw (i, 1, m)
cout << edge[i].u - 1 << " "
<< edge[i].v - 1 << " "
<< (edge[i].w ? edge[i].w : INF) << endl;
}
void dijkstra(bool back) {
memset(d, 0x3f, sizeof(d));
d[s] = 0;
if (back) par[s] = -1;
#define pli pair <ll, int>
pqueue <pli, vector <pli>, greater <pli>> pq;
pq.emp(0, s);
while (!pq.empty()) {
ll dis; int u; tie(dis, u) = pq.top();
pq.pop();
if (dis > d[u]) continue;
for (int i : adj[u]) {
int v = edge[i].other(u), w = edge[i].w;
if (minimize(d[v], dis + (!w ? 1 : w))) {
if (back) par[v] = u;
pq.emp(d[v], v);
}
}
}
}
void solve() {
cin >> n >> m >> L >> s >> t;
++s, ++t;
forw (i, 1, m) {
int u, v, w; cin >> u >> v >> w;
++u, ++v;
edge[i] = Edge(u, v, w);
id[u][v] = id[v][u] = i;
if (w)
adj[u].pushb(i), adj[v].pushb(i);
}
dijkstra(false); // Tìm đường đi ngắn nhất nếu không đụng đến các cạnh khuyết
if (d[t] < L) { // Đường đi ngắn nhất < L -> chẳng bao giờ tạo được cả
cout << "NO\n";
return;
}
if (d[t] == L) { // Chẳng cần thêm bớt gì, cứ thế mà in ra =D
cout << "YES\n";
print();
return;
}
// Thêm các cạnh khuyết vô
forw (i, 1, m) if (!edge[i].w) {
adj[edge[i].u].pushb(i);
adj[edge[i].v].pushb(i);
}
dijkstra(true);
if (d[t] > L) {
cout << "NO\n";
return;
}
vector <int> ans;
for (int pos = t; pos != s; pos = par[pos]) {
int i = id[pos][par[pos]];
if (!edge[i].w) ans.pushb(i);
else L -= edge[i].w;
}
cout << "YES\n";
for (int x : ans) edge[x].w = 1, --L;
edge[ans.back()].w += L;
print();
}
signed main() {
ios::sync_with_stdio(false), cin.tie(nullptr);
srand(time(NULL));
#define name "test"
if (fopen(name".INP", "r")) {
freopen(name".INP", "r", stdin);
freopen(name".OUT", "w", stdout);
}
bool testCase = false;
int numTest = 1;
// cin >> numTest;
forw (i, 1, numTest) {
if (testCase) cout << "Case #" << i << ": ";
solve();
}
return 0;
}
Ly8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIiwgInVucm9sbC1sb29wcyIpCi8vICNwcmFnbWEgR0NDIHRhcmdldCgiYXZ4MiIsICJibWkiLCAiYm1pMiIsICJsemNudCIsICJwb3BjbnQiKQogCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgojZGVmaW5lIGxkYiBsb25nIGRvdWJsZQovLyNkZWZpbmUgZG91YmxlIGxkYgojZGVmaW5lIGRiIGRvdWJsZQojZGVmaW5lIHVub21hcCB1bm9yZGVyZWRfbWFwCiNkZWZpbmUgdW5vc2V0IHVub3JkZXJlZF9zZXQKI2RlZmluZSBlbmRsICdcbicKI2RlZmluZSBzdHIgc3RyaW5nCiNkZWZpbmUgc3Ryc3RyIHN0cmluZ3N0cmVhbQojZGVmaW5lIHN6KGEpIChpbnQpYS5zaXplKCkKI2RlZmluZSBsbCBsb25nIGxvbmcKI2RlZmluZSBpbnQgbGwKI2RlZmluZSBwaWkgcGFpciA8aW50LCBpbnQ+CiNkZWZpbmUgcGxsIHBhaXIgPGxsLCBsbD4KI2RlZmluZSBVbmlxdWUoYSkgYS5yZXNpemUodW5pcXVlKGFsbChhKSkgLSBhLmJlZ2luKCkpCiNkZWZpbmUgdWxsIHVuc2lnbmVkIGxvbmcgbG9uZwojZGVmaW5lIGZpciBmaXJzdAojZGVmaW5lIHNlYyBzZWNvbmQKI2RlZmluZSBpZGMgY2luLmlnbm9yZSgpCiNkZWZpbmUgbGIgbG93ZXJfYm91bmQKI2RlZmluZSB1YiB1cHBlcl9ib3VuZAojZGVmaW5lIGFsbChzKSBzLmJlZ2luKCksIHMuZW5kKCkKI2RlZmluZSByYWxsKHMpIHMucmJlZ2luKCksIHMucmVuZCgpCiNkZWZpbmUgcmV2IHJldmVyc2UKI2RlZmluZSBnY2QgX19nY2QKI2RlZmluZSBwdXNoYiBwdXNoX2JhY2sKI2RlZmluZSBwb3BiIHBvcF9iYWNrCiNkZWZpbmUgcHVzaGYgcHVzaF9mcm9udAojZGVmaW5lIHBvcGYgcG9wX2Zyb250CiNkZWZpbmUgZW1wIGVtcGxhY2UKI2RlZmluZSBlbXBiIGVtcGxhY2VfYmFjawojZGVmaW5lIG11bDJ4KGEsIHgpIGEgPDwgeAojZGVmaW5lIGRpdjJ4KGEsIHgpIGEgPj4geAojZGVmaW5lIGxjbShhLCBiKSAoYSAvIF9fZ2NkKGEsIGIpICogYikKI2RlZmluZSBsb2dfYmFzZSh4LCBiYXNlKSBsb2coeCkgLyBsb2coYmFzZSkKI2RlZmluZSBkZWJ1ZyBjZXJyPDwiTm8gZXJyb3JzISIsZXhpdCgwKTsKI2RlZmluZSBmb3J3KGksIGEsIGIpICBmb3IgKGludCBpID0gYTsgaSA8PSBiOyArK2kpCiNkZWZpbmUgZm9ydzIoaSwgYSwgYikgZm9yIChsbCBpID0gYTsgaSA8PSBiOyArK2kpCiNkZWZpbmUgZm9ycyhpLCBhLCBiKSAgZm9yIChpbnQgaSA9IGE7IGkgPj0gYjsgLS1pKQojZGVmaW5lIGZvcnMyKGksIGEsIGIpIGZvciAobGwgaSA9IGE7IGkgPj0gYjsgLS1pKQojZGVmaW5lIHBxdWV1ZSBwcmlvcml0eV9xdWV1ZQojZGVmaW5lIHNxcnQgc3FydGwKI2RlZmluZSBpMTI4IF9faW50MTI4CiNkZWZpbmUgcG9wY291bnQgX19idWlsdGluX3BvcGNvdW50bGwKI2RlZmluZSBCSVQoeCwgaSkgKCgoeCkgPj4gKGkpKSAmIDEpCiNkZWZpbmUgTUFTSyh4KSAoKDFMTCkgPDwgKHgpKQojZGVmaW5lIHdhbnRfZGlnaXQoeCkgY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oeCk7CiNkZWZpbmUgZXhjdXRpbmdfdGltZSAxMDAwLjAgKiBjbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMKI2RlZmluZSBtYXBhIG1ha2VfcGFpcgp1c2luZyBuYW1lc3BhY2Ugc3RkOwpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsgLy8gOTk4MjQ0MzUzOwpjb25zdCBpbnQgaW5mID0gMWU5Owpjb25zdCBsbCBJTkYgPSAxZTE4OyAvLyBNQVNLKDYzKSAtIDEKY29uc3QgaW50IGxpbU4gPSAxZTMgKyA1Owpjb25zdCBpbnQgbGltTSA9IDFlNCArIDU7CiAKbXQxOTkzN182NCBybmcoY2hyb25vOjpzdGVhZHlfY2xvY2s6Om5vdygpLnRpbWVfc2luY2VfZXBvY2goKS5jb3VudCgpKTsKaW5saW5lIGxsIHJhbmRvbShjb25zdCBsbCAmTCwgY29uc3QgbGwgJlIpIHsKICAgIHJldHVybiB1bmlmb3JtX2ludF9kaXN0cmlidXRpb248bGw+IChMLCBSKSAocm5nKTsKfQogCnRlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgpib29sIG1pbmltaXplKFggJngsIGNvbnN0IFkgJnkpIHsKICAgIHJldHVybiB4ID4geSA/IHggPSB5LCB0cnVlIDogZmFsc2U7Cn0KIAovKiAtLS0tLS0tfn5+fn5+PT09PT0gRU5EIE9GIFRFTVBMQVRFID09PT09fn5+fn5+LS0tLS0tLSAqLwogCnN0cnVjdCBFZGdlIHsKICAgIGludCB1LCB2LCB3OwogICAgRWRnZSgpIHt9CiAgICBFZGdlKGludCBfdSwgaW50IF92LCBpbnQgX3cpOiB1KF91KSwgdihfdiksIHcoX3cpIHt9CiAgICBpbnQgb3RoZXIoaW50IHgpIHsKICAgICAgICByZXR1cm4geCBeIHUgXiB2OwogICAgfQp9IGVkZ2VbbGltTV07CiAKaW50IG4sIG0sIEwsIHMsIHQsIHBhcltsaW1OXSwgaWRbbGltTl1bbGltTl07CmxsIGRbbGltTl07CnZlY3RvciA8aW50PiBhZGpbbGltTl07CiAKdm9pZCBwcmludCgpIHsKICAgIGZvcncgKGksIDEsIG0pCiAgICAgICAgY291dCA8PCBlZGdlW2ldLnUgLSAxIDw8ICIgIiAKICAgICAgICA8PCBlZGdlW2ldLnYgLSAxIDw8ICIgIiAKICAgICAgICA8PCAoZWRnZVtpXS53ID8gZWRnZVtpXS53IDogSU5GKSA8PCBlbmRsOwp9Cgp2b2lkIGRpamtzdHJhKGJvb2wgYmFjaykgewogICAgbWVtc2V0KGQsIDB4M2YsIHNpemVvZihkKSk7CiAgICBkW3NdID0gMDsgCiAgICBpZiAoYmFjaykgcGFyW3NdID0gLTE7CiAgICAjZGVmaW5lIHBsaSBwYWlyIDxsbCwgaW50PgogICAgcHF1ZXVlIDxwbGksIHZlY3RvciA8cGxpPiwgZ3JlYXRlciA8cGxpPj4gcHE7CiAgICBwcS5lbXAoMCwgcyk7CiAgICB3aGlsZSAoIXBxLmVtcHR5KCkpIHsKICAgICAgICBsbCBkaXM7IGludCB1OyB0aWUoZGlzLCB1KSA9IHBxLnRvcCgpOwogICAgICAgIHBxLnBvcCgpOwogICAgICAgIGlmIChkaXMgPiBkW3VdKSBjb250aW51ZTsKICAgICAgICAKICAgICAgICBmb3IgKGludCBpIDogYWRqW3VdKSB7CiAgICAgICAgICAgIGludCB2ID0gZWRnZVtpXS5vdGhlcih1KSwgdyA9IGVkZ2VbaV0udzsKICAgICAgICAgICAgaWYgKG1pbmltaXplKGRbdl0sIGRpcyArICghdyA/IDEgOiB3KSkpIHsKICAgICAgICAgICAgICAgIGlmIChiYWNrKSBwYXJbdl0gPSB1OwogICAgICAgICAgICAgICAgcHEuZW1wKGRbdl0sIHYpOwogICAgICAgICAgICB9CiAgICAgICAgfQogICAgfQp9CiAKdm9pZCBzb2x2ZSgpIHsKICAgIGNpbiA+PiBuID4+IG0gPj4gTCA+PiBzID4+IHQ7CiAgICArK3MsICsrdDsKICAgIGZvcncgKGksIDEsIG0pIHsKICAgICAgICBpbnQgdSwgdiwgdzsgY2luID4+IHUgPj4gdiA+PiB3OwogICAgICAgICsrdSwgKyt2OwogICAgICAgIGVkZ2VbaV0gPSBFZGdlKHUsIHYsIHcpOwogICAgICAgIGlkW3VdW3ZdID0gaWRbdl1bdV0gPSBpOwogICAgICAgIGlmICh3KSAKICAgICAgICAgICAgYWRqW3VdLnB1c2hiKGkpLCBhZGpbdl0ucHVzaGIoaSk7CiAgICB9CiAgICAKICAgIGRpamtzdHJhKGZhbHNlKTsgLy8gVMOsbSDEkcaw4budbmcgxJFpIG5n4bqvbiBuaOG6pXQgbuG6v3Uga2jDtG5nIMSR4bulbmcgxJHhur9uIGPDoWMgY+G6oW5oIGtodXnhur90CiAgICAKICAgIGlmIChkW3RdIDwgTCkgeyAvLyDEkMaw4budbmcgxJFpIG5n4bqvbiBuaOG6pXQgPCBMIC0+IGNo4bqzbmcgYmFvIGdp4budIHThuqFvIMSRxrDhu6NjIGPhuqMKICAgICAgICBjb3V0IDw8ICJOT1xuIjsKICAgICAgICByZXR1cm47CiAgICB9CiAgICBpZiAoZFt0XSA9PSBMKSB7IC8vIENo4bqzbmcgY+G6p24gdGjDqm0gYuG7m3QgZ8OsLCBj4bupIHRo4bq/IG3DoCBpbiByYSA9RAogICAgICAgIGNvdXQgPDwgIllFU1xuIjsKICAgICAgICBwcmludCgpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBUaMOqbSBjw6FjIGPhuqFuaCBraHV54bq/dCB2w7QKICAgIGZvcncgKGksIDEsIG0pIGlmICghZWRnZVtpXS53KSB7CiAgICAgICAgYWRqW2VkZ2VbaV0udV0ucHVzaGIoaSk7CiAgICAgICAgYWRqW2VkZ2VbaV0udl0ucHVzaGIoaSk7CiAgICB9CgogICAgZGlqa3N0cmEodHJ1ZSk7CiAKICAgIGlmIChkW3RdID4gTCkgewogICAgICAgIGNvdXQgPDwgIk5PXG4iOwogICAgICAgIHJldHVybjsKICAgIH0KIAogICAgdmVjdG9yIDxpbnQ+IGFuczsKICAgIGZvciAoaW50IHBvcyA9IHQ7IHBvcyAhPSBzOyBwb3MgPSBwYXJbcG9zXSkgewogICAgICAgIGludCBpID0gaWRbcG9zXVtwYXJbcG9zXV07CiAgICAgICAgaWYgKCFlZGdlW2ldLncpIGFucy5wdXNoYihpKTsKICAgICAgICBlbHNlIEwgLT0gZWRnZVtpXS53OwogICAgfQoKICAgIGNvdXQgPDwgIllFU1xuIjsKICAgIGZvciAoaW50IHggOiBhbnMpIGVkZ2VbeF0udyA9IDEsIC0tTDsKICAgIGVkZ2VbYW5zLmJhY2soKV0udyArPSBMOwogICAgcHJpbnQoKTsKfQogCnNpZ25lZCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpLCBjaW4udGllKG51bGxwdHIpOwogICAgc3JhbmQodGltZShOVUxMKSk7CiAgICAjZGVmaW5lIG5hbWUgInRlc3QiCiAgICBpZiAoZm9wZW4obmFtZSIuSU5QIiwgInIiKSkgewogICAgICAgIGZyZW9wZW4obmFtZSIuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihuYW1lIi5PVVQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBib29sIHRlc3RDYXNlID0gZmFsc2U7CiAgICBpbnQgbnVtVGVzdCA9IDE7CiAgICAvLyBjaW4gPj4gbnVtVGVzdDsKICAgIGZvcncgKGksIDEsIG51bVRlc3QpIHsKICAgICAgICBpZiAodGVzdENhc2UpIGNvdXQgPDwgIkNhc2UgIyIgPDwgaSA8PCAiOiAiOwogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==