#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int MAXN = 1005;
const int MAXT = 100005;
const ll INF = 1e18;
int n, m, s, t;
int st, en;
vector<pair<int, int>> adj[MAXN];
ll dist[MAXN][MAXN]; // dist[i][j]: khoảng cách từ i đến j
ll price[MAXN]; // giá xăng rẻ nhất tại thành phố i
vector<int> important; // danh sách các đỉnh quan trọng
int idx_map[MAXN]; // ánh xạ id đỉnh gốc -> index trong important
void dijkstra(int start, ll d[]) {
for (int i = 1; i <= n; i++) d[i] = INF;
d[start] = 0;
priority_queue<pair<ll, int>, vector<pair<ll, int>>, greater<pair<ll, int>>> pq;
pq.push({0, start});
while (!pq.empty()) {
int u = pq.top().second;
ll cur_d = pq.top().first;
pq.pop();
if (cur_d != d[u]) continue;
for (auto &e : adj[u]) {
int v = e.first, w = e.second;
if (d[v] > d[u] + w) {
d[v] = d[u] + w;
pq.push({d[v], v});
}
}
}
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(0);
// Đọc input
cin >> n >> m >> s;
cin >> t;
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
adj[u].push_back({v, w});
adj[v].push_back({u, w});
}
for (int i = 1; i <= n; i++) price[i] = INF;
for (int i = 0; i < s; i++) {
int p, c;
cin >> p >> c;
price[p] = min(price[p], (ll)c);
}
cin >> st >> en;
// Thêm các đỉnh quan trọng: có trạm xăng hoặc st, en
set<int> imp_set;
for (int i = 1; i <= n; i++) {
if (price[i] != INF) imp_set.insert(i);
}
imp_set.insert(st);
imp_set.insert(en);
important = vector<int>(imp_set.begin(), imp_set.end());
int k = important.size();
for (int i = 0; i < k; i++) {
idx_map[important[i]] = i;
}
// Tính khoảng cách giữa các đỉnh quan trọng
for (int i = 0; i < k; i++) {
int u = important[i];
dijkstra(u, dist[u]);
}
// Khởi tạo dp: [id trong important][lượng xăng]
vector<vector<ll>> dp(k, vector<ll>(t+1, INF));
int st_idx = idx_map[st];
for (int f = 0; f <= t; f++) {
dp[st_idx][f] = price[st] * f;
}
// Dijkstra trên state (i, f)
using state = tuple<ll, int, int>; // (cost, id, fuel)
priority_queue<state, vector<state>, greater<state>> pq;
for (int f = 0; f <= t; f++) {
if (dp[st_idx][f] < INF) {
pq.push({dp[st_idx][f], st_idx, f});
}
}
while (!pq.empty()) {
auto [cost, i, f] = pq.top();
pq.pop();
if (cost != dp[i][f]) continue;
int u = important[i];
// Mua thêm 1 lít
if (f < t) {
ll new_cost = cost + price[u];
if (new_cost < dp[i][f+1]) {
dp[i][f+1] = new_cost;
pq.push({new_cost, i, f+1});
}
}
// Di chuyển đến đỉnh quan trọng khác
for (int j = 0; j < k; j++) {
if (i == j) continue;
int v = important[j];
ll d = dist[u][v];
if (d > t) continue; // không thể đi thẳng
if (f < d) continue; // không đủ xăng
int new_f = f - d;
if (dp[j][new_f] > cost) {
dp[j][new_f] = cost;
pq.push({cost, j, new_f});
}
}
}
// Kết quả
int en_idx = idx_map[en];
ll ans = INF;
for (int f = 0; f <= t; f++) {
ans = min(ans, dp[en_idx][f]);
}
cout << ans << endl;
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwpjb25zdCBpbnQgTUFYTiA9IDEwMDU7CmNvbnN0IGludCBNQVhUID0gMTAwMDA1Owpjb25zdCBsbCBJTkYgPSAxZTE4OwoKaW50IG4sIG0sIHMsIHQ7CmludCBzdCwgZW47CnZlY3RvcjxwYWlyPGludCwgaW50Pj4gYWRqW01BWE5dOwpsbCBkaXN0W01BWE5dW01BWE5dOyAvLyBkaXN0W2ldW2pdOiBraG/huqNuZyBjw6FjaCB04burIGkgxJHhur9uIGoKbGwgcHJpY2VbTUFYTl07ICAgICAgLy8gZ2nDoSB4xINuZyBy4bq7IG5o4bqldCB04bqhaSB0aMOgbmggcGjhu5EgaQp2ZWN0b3I8aW50PiBpbXBvcnRhbnQ7IC8vIGRhbmggc8OhY2ggY8OhYyDEkeG7iW5oIHF1YW4gdHLhu41uZwppbnQgaWR4X21hcFtNQVhOXTsgICAvLyDDoW5oIHjhuqEgaWQgxJHhu4luaCBn4buRYyAtPiBpbmRleCB0cm9uZyBpbXBvcnRhbnQKCnZvaWQgZGlqa3N0cmEoaW50IHN0YXJ0LCBsbCBkW10pIHsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgZFtpXSA9IElORjsKICAgIGRbc3RhcnRdID0gMDsKICAgIHByaW9yaXR5X3F1ZXVlPHBhaXI8bGwsIGludD4sIHZlY3RvcjxwYWlyPGxsLCBpbnQ+PiwgZ3JlYXRlcjxwYWlyPGxsLCBpbnQ+Pj4gcHE7CiAgICBwcS5wdXNoKHswLCBzdGFydH0pOwogICAgd2hpbGUgKCFwcS5lbXB0eSgpKSB7CiAgICAgICAgaW50IHUgPSBwcS50b3AoKS5zZWNvbmQ7CiAgICAgICAgbGwgY3VyX2QgPSBwcS50b3AoKS5maXJzdDsKICAgICAgICBwcS5wb3AoKTsKICAgICAgICBpZiAoY3VyX2QgIT0gZFt1XSkgY29udGludWU7CiAgICAgICAgZm9yIChhdXRvICZlIDogYWRqW3VdKSB7CiAgICAgICAgICAgIGludCB2ID0gZS5maXJzdCwgdyA9IGUuc2Vjb25kOwogICAgICAgICAgICBpZiAoZFt2XSA+IGRbdV0gKyB3KSB7CiAgICAgICAgICAgICAgICBkW3ZdID0gZFt1XSArIHc7CiAgICAgICAgICAgICAgICBwcS5wdXNoKHtkW3ZdLCB2fSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICB9Cn0KCmludCBtYWluKCkgewogICAgaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgICBjaW4udGllKDApOwoKICAgIC8vIMSQ4buNYyBpbnB1dAogICAgY2luID4+IG4gPj4gbSA+PiBzOwogICAgY2luID4+IHQ7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgIGludCB1LCB2LCB3OwogICAgICAgIGNpbiA+PiB1ID4+IHYgPj4gdzsKICAgICAgICBhZGpbdV0ucHVzaF9iYWNrKHt2LCB3fSk7CiAgICAgICAgYWRqW3ZdLnB1c2hfYmFjayh7dSwgd30pOwogICAgfQogICAgZm9yIChpbnQgaSA9IDE7IGkgPD0gbjsgaSsrKSBwcmljZVtpXSA9IElORjsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgczsgaSsrKSB7CiAgICAgICAgaW50IHAsIGM7CiAgICAgICAgY2luID4+IHAgPj4gYzsKICAgICAgICBwcmljZVtwXSA9IG1pbihwcmljZVtwXSwgKGxsKWMpOwogICAgfQogICAgY2luID4+IHN0ID4+IGVuOwoKICAgIC8vIFRow6ptIGPDoWMgxJHhu4luaCBxdWFuIHRy4buNbmc6IGPDsyB0cuG6oW0geMSDbmcgaG/hurdjIHN0LCBlbgogICAgc2V0PGludD4gaW1wX3NldDsKICAgIGZvciAoaW50IGkgPSAxOyBpIDw9IG47IGkrKykgewogICAgICAgIGlmIChwcmljZVtpXSAhPSBJTkYpIGltcF9zZXQuaW5zZXJ0KGkpOwogICAgfQogICAgaW1wX3NldC5pbnNlcnQoc3QpOwogICAgaW1wX3NldC5pbnNlcnQoZW4pOwogICAgaW1wb3J0YW50ID0gdmVjdG9yPGludD4oaW1wX3NldC5iZWdpbigpLCBpbXBfc2V0LmVuZCgpKTsKICAgIGludCBrID0gaW1wb3J0YW50LnNpemUoKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgazsgaSsrKSB7CiAgICAgICAgaWR4X21hcFtpbXBvcnRhbnRbaV1dID0gaTsKICAgIH0KCiAgICAvLyBUw61uaCBraG/huqNuZyBjw6FjaCBnaeG7r2EgY8OhYyDEkeG7iW5oIHF1YW4gdHLhu41uZwogICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpKyspIHsKICAgICAgICBpbnQgdSA9IGltcG9ydGFudFtpXTsKICAgICAgICBkaWprc3RyYSh1LCBkaXN0W3VdKTsKICAgIH0KCiAgICAvLyBLaOG7n2kgdOG6oW8gZHA6IFtpZCB0cm9uZyBpbXBvcnRhbnRdW2zGsOG7o25nIHjEg25nXQogICAgdmVjdG9yPHZlY3RvcjxsbD4+IGRwKGssIHZlY3RvcjxsbD4odCsxLCBJTkYpKTsKICAgIGludCBzdF9pZHggPSBpZHhfbWFwW3N0XTsKICAgIGZvciAoaW50IGYgPSAwOyBmIDw9IHQ7IGYrKykgewogICAgICAgIGRwW3N0X2lkeF1bZl0gPSBwcmljZVtzdF0gKiBmOwogICAgfQoKICAgIC8vIERpamtzdHJhIHRyw6puIHN0YXRlIChpLCBmKQogICAgdXNpbmcgc3RhdGUgPSB0dXBsZTxsbCwgaW50LCBpbnQ+OyAvLyAoY29zdCwgaWQsIGZ1ZWwpCiAgICBwcmlvcml0eV9xdWV1ZTxzdGF0ZSwgdmVjdG9yPHN0YXRlPiwgZ3JlYXRlcjxzdGF0ZT4+IHBxOwogICAgZm9yIChpbnQgZiA9IDA7IGYgPD0gdDsgZisrKSB7CiAgICAgICAgaWYgKGRwW3N0X2lkeF1bZl0gPCBJTkYpIHsKICAgICAgICAgICAgcHEucHVzaCh7ZHBbc3RfaWR4XVtmXSwgc3RfaWR4LCBmfSk7CiAgICAgICAgfQogICAgfQoKICAgIHdoaWxlICghcHEuZW1wdHkoKSkgewogICAgICAgIGF1dG8gW2Nvc3QsIGksIGZdID0gcHEudG9wKCk7CiAgICAgICAgcHEucG9wKCk7CiAgICAgICAgaWYgKGNvc3QgIT0gZHBbaV1bZl0pIGNvbnRpbnVlOwogICAgICAgIGludCB1ID0gaW1wb3J0YW50W2ldOwoKICAgICAgICAvLyBNdWEgdGjDqm0gMSBsw610CiAgICAgICAgaWYgKGYgPCB0KSB7CiAgICAgICAgICAgIGxsIG5ld19jb3N0ID0gY29zdCArIHByaWNlW3VdOwogICAgICAgICAgICBpZiAobmV3X2Nvc3QgPCBkcFtpXVtmKzFdKSB7CiAgICAgICAgICAgICAgICBkcFtpXVtmKzFdID0gbmV3X2Nvc3Q7CiAgICAgICAgICAgICAgICBwcS5wdXNoKHtuZXdfY29zdCwgaSwgZisxfSk7CiAgICAgICAgICAgIH0KICAgICAgICB9CgogICAgICAgIC8vIERpIGNodXnhu4NuIMSR4bq/biDEkeG7iW5oIHF1YW4gdHLhu41uZyBraMOhYwogICAgICAgIGZvciAoaW50IGogPSAwOyBqIDwgazsgaisrKSB7CiAgICAgICAgICAgIGlmIChpID09IGopIGNvbnRpbnVlOwogICAgICAgICAgICBpbnQgdiA9IGltcG9ydGFudFtqXTsKICAgICAgICAgICAgbGwgZCA9IGRpc3RbdV1bdl07CiAgICAgICAgICAgIGlmIChkID4gdCkgY29udGludWU7IC8vIGtow7RuZyB0aOG7gyDEkWkgdGjhurNuZwogICAgICAgICAgICBpZiAoZiA8IGQpIGNvbnRpbnVlOyAvLyBraMO0bmcgxJHhu6cgeMSDbmcKICAgICAgICAgICAgaW50IG5ld19mID0gZiAtIGQ7CiAgICAgICAgICAgIGlmIChkcFtqXVtuZXdfZl0gPiBjb3N0KSB7CiAgICAgICAgICAgICAgICBkcFtqXVtuZXdfZl0gPSBjb3N0OwogICAgICAgICAgICAgICAgcHEucHVzaCh7Y29zdCwgaiwgbmV3X2Z9KTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KCiAgICAvLyBL4bq/dCBxdeG6owogICAgaW50IGVuX2lkeCA9IGlkeF9tYXBbZW5dOwogICAgbGwgYW5zID0gSU5GOwogICAgZm9yIChpbnQgZiA9IDA7IGYgPD0gdDsgZisrKSB7CiAgICAgICAgYW5zID0gbWluKGFucywgZHBbZW5faWR4XVtmXSk7CiAgICB9CiAgICBjb3V0IDw8IGFucyA8PCBlbmRsOwoKICAgIHJldHVybiAwOwp9