// #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() {
// Đã có giá trị thì cứ in, không thì in 1e18 để tránh tạo ra đường bất ổn nào đó
forw (i, 1, m)
cout << edge[i].u - 1 << " " << edge[i].v - 1 << " " << (edge[i].w ? edge[i].w : INF) << endl;
}
// Dịch vị trí về 1-based (do quen) và lúc in phải -1 ngược lại T^T
void solve() {
cin >> n >> m >> L >> s >> t; ++s, ++t;
// Nhập các cạnh
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;
adj[u].pushb(i), adj[v].pushb(i);
}
// Reset chưa thăm
memset(d, 0x3f, sizeof(d));
// Đỉnh s bắt đầu và không có ba ;"(
d[s] = 0; par[s] = -1;
// Chạy dijkstra
#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;
// Với những cạnh khuyết, tạm gán nó là 1 (giá trị nó nhất nó có thể nhận)
if (minimize(d[v], dis + (!w ? 1 : w))) {
par[v] = u, pq.emp(d[v], v);
}
}
}
if (d[t] > L) { // Đường đi ngắn nhất vẫn lớn hơn L => không có đường nào khác thoả mãn
cout << "NO\n";
return;
}
vector <int> zero; // zero lưu id những cạnh khuyết
for (int pos = t; pos != s; pos = par[pos]) {
int i = id[pos][par[pos]];
if (!edge[i].w) zero.pushb(i);
else L -= edge[i].w;
}
if (sz(zero) == L) { // Số cạnh khuyết tương đương với lượng còn thiếu
// Chắc chắn tạo được với giá trị mỗi cạnh khuyết trên đường đi là 1
cout << "YES\n";
for (int x : zero) edge[x].w = 1;
print();
return;
}
// Khi code chạy xuống đây, chắc chắn đây là trường hợp đường đi nhỏ nhất < L
if (!sz(zero)) { // Không có khuyết thì không thể điền cho nó bằng L => không có cách nào
cout << "NO\n";
return;
}
// Mỗi cạnh đều là 1, cạnh cuối nhận phần còn thiếu
cout << "YES\n";
for (int x : zero) edge[x].w = 1, --L;
edge[zero.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;
}
Ly8gI3ByYWdtYSBHQ0Mgb3B0aW1pemUoIk8zIiwgInVucm9sbC1sb29wcyIpCi8vICNwcmFnbWEgR0NDIHRhcmdldCgiYXZ4MiIsICJibWkiLCAiYm1pMiIsICJsemNudCIsICJwb3BjbnQiKQoKI2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CiNkZWZpbmUgbGRiIGxvbmcgZG91YmxlCi8vI2RlZmluZSBkb3VibGUgbGRiCiNkZWZpbmUgZGIgZG91YmxlCiNkZWZpbmUgdW5vbWFwIHVub3JkZXJlZF9tYXAKI2RlZmluZSB1bm9zZXQgdW5vcmRlcmVkX3NldAojZGVmaW5lIGVuZGwgJ1xuJwojZGVmaW5lIHN0ciBzdHJpbmcKI2RlZmluZSBzdHJzdHIgc3RyaW5nc3RyZWFtCiNkZWZpbmUgc3ooYSkgKGludClhLnNpemUoKQojZGVmaW5lIGxsIGxvbmcgbG9uZwovLyAjZGVmaW5lIGludCBsbAojZGVmaW5lIHBpaSBwYWlyIDxpbnQsIGludD4KI2RlZmluZSBwbGwgcGFpciA8bGwsIGxsPgojZGVmaW5lIFVuaXF1ZShhKSBhLnJlc2l6ZSh1bmlxdWUoYWxsKGEpKSAtIGEuYmVnaW4oKSkKI2RlZmluZSB1bGwgdW5zaWduZWQgbG9uZyBsb25nCiNkZWZpbmUgZmlyIGZpcnN0CiNkZWZpbmUgc2VjIHNlY29uZAojZGVmaW5lIGlkYyBjaW4uaWdub3JlKCkKI2RlZmluZSBsYiBsb3dlcl9ib3VuZAojZGVmaW5lIHViIHVwcGVyX2JvdW5kCiNkZWZpbmUgYWxsKHMpIHMuYmVnaW4oKSwgcy5lbmQoKQojZGVmaW5lIHJhbGwocykgcy5yYmVnaW4oKSwgcy5yZW5kKCkKI2RlZmluZSByZXYgcmV2ZXJzZQojZGVmaW5lIGdjZCBfX2djZAojZGVmaW5lIHB1c2hiIHB1c2hfYmFjawojZGVmaW5lIHBvcGIgcG9wX2JhY2sKI2RlZmluZSBwdXNoZiBwdXNoX2Zyb250CiNkZWZpbmUgcG9wZiBwb3BfZnJvbnQKI2RlZmluZSBlbXAgZW1wbGFjZQojZGVmaW5lIGVtcGIgZW1wbGFjZV9iYWNrCiNkZWZpbmUgbXVsMngoYSwgeCkgYSA8PCB4CiNkZWZpbmUgZGl2MngoYSwgeCkgYSA+PiB4CiNkZWZpbmUgbGNtKGEsIGIpIChhIC8gX19nY2QoYSwgYikgKiBiKQojZGVmaW5lIGxvZ19iYXNlKHgsIGJhc2UpIGxvZyh4KSAvIGxvZyhiYXNlKQojZGVmaW5lIGRlYnVnIGNlcnI8PCJObyBlcnJvcnMhIixleGl0KDApOwojZGVmaW5lIGZvcncoaSwgYSwgYikgIGZvciAoaW50IGkgPSBhOyBpIDw9IGI7ICsraSkKI2RlZmluZSBmb3J3MihpLCBhLCBiKSBmb3IgKGxsIGkgPSBhOyBpIDw9IGI7ICsraSkKI2RlZmluZSBmb3JzKGksIGEsIGIpICBmb3IgKGludCBpID0gYTsgaSA+PSBiOyAtLWkpCiNkZWZpbmUgZm9yczIoaSwgYSwgYikgZm9yIChsbCBpID0gYTsgaSA+PSBiOyAtLWkpCiNkZWZpbmUgcHF1ZXVlIHByaW9yaXR5X3F1ZXVlCiNkZWZpbmUgc3FydCBzcXJ0bAojZGVmaW5lIGkxMjggX19pbnQxMjgKI2RlZmluZSBwb3Bjb3VudCBfX2J1aWx0aW5fcG9wY291bnRsbAojZGVmaW5lIEJJVCh4LCBpKSAoKCh4KSA+PiAoaSkpICYgMSkKI2RlZmluZSBNQVNLKHgpICgoMUxMKSA8PCAoeCkpCiNkZWZpbmUgd2FudF9kaWdpdCh4KSBjb3V0IDw8IGZpeGVkIDw8IHNldHByZWNpc2lvbih4KTsKI2RlZmluZSBleGN1dGluZ190aW1lIDEwMDAuMCAqIGNsb2NrKCkgLyBDTE9DS1NfUEVSX1NFQwojZGVmaW5lIG1hcGEgbWFrZV9wYWlyCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CmNvbnN0IGludCBNT0QgPSAxZTkgKyA3OyAvLyA5OTgyNDQzNTM7CmNvbnN0IGludCBpbmYgPSAxZTk7CmNvbnN0IGxsIElORiA9IDFlMTg7IC8vIE1BU0soNjMpIC0gMQpjb25zdCBpbnQgbGltTiA9IDFlMyArIDU7CmNvbnN0IGludCBsaW1NID0gMWU0ICsgNTsKCm10MTk5MzdfNjQgcm5nKGNocm9ubzo6c3RlYWR5X2Nsb2NrOjpub3coKS50aW1lX3NpbmNlX2Vwb2NoKCkuY291bnQoKSk7CmlubGluZSBsbCByYW5kb20oY29uc3QgbGwgJkwsIGNvbnN0IGxsICZSKSB7CiAgICByZXR1cm4gdW5pZm9ybV9pbnRfZGlzdHJpYnV0aW9uPGxsPiAoTCwgUikgKHJuZyk7Cn0KCnRlbXBsYXRlIDxjbGFzcyBYLCBjbGFzcyBZPgpib29sIG1pbmltaXplKFggJngsIGNvbnN0IFkgJnkpIHsKICAgIHJldHVybiB4ID4geSA/IHggPSB5LCB0cnVlIDogZmFsc2U7Cn0KCi8qIC0tLS0tLS1+fn5+fn49PT09PSBFTkQgT0YgVEVNUExBVEUgPT09PT1+fn5+fn4tLS0tLS0tICovCgpzdHJ1Y3QgRWRnZSB7CiAgICBpbnQgdSwgdiwgdzsKICAgIEVkZ2UoKSB7fQogICAgRWRnZShpbnQgX3UsIGludCBfdiwgaW50IF93KTogdShfdSksIHYoX3YpLCB3KF93KSB7fQogICAgaW50IG90aGVyKGludCB4KSB7CiAgICAgICAgcmV0dXJuIHggXiB1IF4gdjsKICAgIH0KfSBlZGdlW2xpbU1dOwoKaW50IG4sIG0sIEwsIHMsIHQsIHBhcltsaW1OXSwgaWRbbGltTl1bbGltTl07CmxsIGRbbGltTl07CnZlY3RvciA8aW50PiBhZGpbbGltTl07Cgp2b2lkIHByaW50KCkgewogICAgLy8gxJDDoyBjw7MgZ2nDoSB0cuG7iyB0aMOsIGPhu6kgaW4sIGtow7RuZyB0aMOsIGluIDFlMTggxJHhu4MgdHLDoW5oIHThuqFvIHJhIMSRxrDhu51uZyBi4bqldCDhu5VuIG7DoG8gxJHDswogICAgZm9ydyAoaSwgMSwgbSkKICAgICAgICBjb3V0IDw8IGVkZ2VbaV0udSAtIDEgPDwgIiAiIDw8IGVkZ2VbaV0udiAtIDEgPDwgIiAiIDw8IChlZGdlW2ldLncgPyBlZGdlW2ldLncgOiBJTkYpIDw8IGVuZGw7Cn0KCi8vIEThu4tjaCB24buLIHRyw60gduG7gSAxLWJhc2VkIChkbyBxdWVuKSB2w6AgbMO6YyBpbiBwaOG6o2kgLTEgbmfGsOG7o2MgbOG6oWkgVF5UCgp2b2lkIHNvbHZlKCkgewogICAgY2luID4+IG4gPj4gbSA+PiBMID4+IHMgPj4gdDsgKytzLCArK3Q7CiAgICAvLyBOaOG6rXAgY8OhYyBj4bqhbmgKICAgIGZvcncgKGksIDEsIG0pIHsKICAgICAgICBpbnQgdSwgdiwgdzsgY2luID4+IHUgPj4gdiA+PiB3OwogICAgICAgICsrdSwgKyt2OyBlZGdlW2ldID0gRWRnZSh1LCB2LCB3KTsKICAgICAgICBpZFt1XVt2XSA9IGlkW3ZdW3VdID0gaTsKICAgICAgICBhZGpbdV0ucHVzaGIoaSksIGFkalt2XS5wdXNoYihpKTsKICAgIH0KCiAgICAvLyBSZXNldCBjaMawYSB0aMSDbQogICAgbWVtc2V0KGQsIDB4M2YsIHNpemVvZihkKSk7CiAgICAvLyDEkOG7iW5oIHMgYuG6r3QgxJHhuqd1IHbDoCBraMO0bmcgY8OzIGJhIDsiKAogICAgZFtzXSA9IDA7IHBhcltzXSA9IC0xOwoKICAgIC8vIENo4bqheSBkaWprc3RyYQogICAgI2RlZmluZSBwbGkgcGFpciA8bGwsIGludD4KICAgIHBxdWV1ZSA8cGxpLCB2ZWN0b3IgPHBsaT4sIGdyZWF0ZXIgPHBsaT4+IHBxOwogICAgcHEuZW1wKDAsIHMpOwogICAgd2hpbGUgKCFwcS5lbXB0eSgpKSB7CiAgICAgICAgbGwgZGlzOyBpbnQgdTsgCiAgICAgICAgdGllKGRpcywgdSkgPSBwcS50b3AoKTsgcHEucG9wKCk7CiAgICAgICAgaWYgKGRpcyA+IGRbdV0pIGNvbnRpbnVlOwogICAgICAgIAogICAgICAgIGZvciAoaW50IGkgOiBhZGpbdV0pIHsKICAgICAgICAgICAgaW50IHYgPSBlZGdlW2ldLm90aGVyKHUpLCB3ID0gZWRnZVtpXS53OwogICAgICAgICAgICAvLyBW4bubaSBuaOG7r25nIGPhuqFuaCBraHV54bq/dCwgdOG6oW0gZ8OhbiBuw7MgbMOgIDEgKGdpw6EgdHLhu4sgbsOzIG5o4bqldCBuw7MgY8OzIHRo4buDIG5o4bqtbikKICAgICAgICAgICAgaWYgKG1pbmltaXplKGRbdl0sIGRpcyArICghdyA/IDEgOiB3KSkpIHsKICAgICAgICAgICAgICAgIHBhclt2XSA9IHUsIHBxLmVtcChkW3ZdLCB2KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICBpZiAoZFt0XSA+IEwpIHsgLy8gxJDGsOG7nW5nIMSRaSBuZ+G6r24gbmjhuqV0IHbhuqtuIGzhu5tuIGjGoW4gTCA9PiBraMO0bmcgY8OzIMSRxrDhu51uZyBuw6BvIGtow6FjIHRob+G6oyBtw6NuCiAgICAgICAgY291dCA8PCAiTk9cbiI7CiAgICAgICAgcmV0dXJuOwogICAgfQoKICAgIHZlY3RvciA8aW50PiB6ZXJvOyAvLyB6ZXJvIGzGsHUgaWQgbmjhu69uZyBj4bqhbmgga2h1eeG6v3QKICAgIGZvciAoaW50IHBvcyA9IHQ7IHBvcyAhPSBzOyBwb3MgPSBwYXJbcG9zXSkgewogICAgICAgIGludCBpID0gaWRbcG9zXVtwYXJbcG9zXV07CiAgICAgICAgaWYgKCFlZGdlW2ldLncpIHplcm8ucHVzaGIoaSk7CiAgICAgICAgZWxzZSBMIC09IGVkZ2VbaV0udzsKICAgIH0KCiAgICBpZiAoc3ooemVybykgPT0gTCkgeyAvLyBT4buRIGPhuqFuaCBraHV54bq/dCB0xrDGoW5nIMSRxrDGoW5nIHbhu5tpIGzGsOG7o25nIGPDsm4gdGhp4bq/dQogICAgICAgIC8vIENo4bqvYyBjaOG6r24gdOG6oW8gxJHGsOG7o2MgduG7m2kgZ2nDoSB0cuG7iyBt4buXaSBj4bqhbmgga2h1eeG6v3QgdHLDqm4gxJHGsOG7nW5nIMSRaSBsw6AgMQogICAgICAgIGNvdXQgPDwgIllFU1xuIjsKICAgICAgICBmb3IgKGludCB4IDogemVybykgZWRnZVt4XS53ID0gMTsKICAgICAgICBwcmludCgpOwogICAgICAgIHJldHVybjsKICAgIH0KCiAgICAvLyBLaGkgY29kZSBjaOG6oXkgeHXhu5FuZyDEkcOieSwgY2jhuq9jIGNo4bqvbiDEkcOieSBsw6AgdHLGsOG7nW5nIGjhu6NwIMSRxrDhu51uZyDEkWkgbmjhu48gbmjhuqV0IDwgTAogICAgaWYgKCFzeih6ZXJvKSkgeyAvLyBLaMO0bmcgY8OzIGtodXnhur90IHRow6wga2jDtG5nIHRo4buDIMSRaeG7gW4gY2hvIG7DsyBi4bqxbmcgTCA9PiBraMO0bmcgY8OzIGPDoWNoIG7DoG8KICAgICAgICBjb3V0IDw8ICJOT1xuIjsKICAgICAgICByZXR1cm47CiAgICB9CgogICAgLy8gTeG7l2kgY+G6oW5oIMSR4buBdSBsw6AgMSwgY+G6oW5oIGN14buRaSBuaOG6rW4gcGjhuqduIGPDsm4gdGhp4bq/dQogICAgY291dCA8PCAiWUVTXG4iOwogICAgZm9yIChpbnQgeCA6IHplcm8pIGVkZ2VbeF0udyA9IDEsIC0tTDsKICAgIGVkZ2VbemVyby5iYWNrKCldLncgKz0gTDsKICAgIHByaW50KCk7Cn0KCnNpZ25lZCBtYWluKCkgewogICAgaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpLCBjaW4udGllKG51bGxwdHIpOwogICAgc3JhbmQodGltZShOVUxMKSk7CiAgICAjZGVmaW5lIG5hbWUgInRlc3QiCiAgICBpZiAoZm9wZW4obmFtZSIuSU5QIiwgInIiKSkgewogICAgICAgIGZyZW9wZW4obmFtZSIuSU5QIiwgInIiLCBzdGRpbik7CiAgICAgICAgZnJlb3BlbihuYW1lIi5PVVQiLCAidyIsIHN0ZG91dCk7CiAgICB9CiAgICBib29sIHRlc3RDYXNlID0gZmFsc2U7CiAgICBpbnQgbnVtVGVzdCA9IDE7CiAgICAvLyBjaW4gPj4gbnVtVGVzdDsKICAgIGZvcncgKGksIDEsIG51bVRlc3QpIHsKICAgICAgICBpZiAodGVzdENhc2UpIGNvdXQgPDwgIkNhc2UgIyIgPDwgaSA8PCAiOiAiOwogICAgICAgIHNvbHZlKCk7CiAgICB9CiAgICByZXR1cm4gMDsKfQo=