/*
* Author : Apu Das Orgho
* Problem : Series-Parallel Voltage Calculator
* Created on: 27-09-2025
*/
#include <bits/stdc++.h>
#define iamspeed ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define endl '\n'
using namespace std;
using ll = long long;
using ld = long double;
struct E {
int a, b;
ll w;
};
int main() {
iamspeed
int n, m;
ll V;
if (!(cin >> n >> m >> V)) return 0;
vector<E> edges(m);
vector<vector<pair<int, int> > > adj(n);
for (int i = 0; i < m; i++) {
int a, b;
ll c;
cin >> a >> b >> c;
edges[i] = {a, b, c};
adj[a].push_back({b, i});
adj[b].push_back({a, i});
}
int q;
cin >> q;
if (q == 0) {
cout.setf(std::ios::fixed);
cout << setprecision(10) << (ld) V << "\n";
return 0;
}
if (q == n - 1) {
cout.setf(std::ios::fixed);
cout << setprecision(10) << 0.0L << "\n";
return 0;
}
vector<int> deg(n);
for (int i = 0; i < n; i++) deg[i] = adj[i].size();
vector<char> isJ(n, 0);
for (int i = 0; i < n; i++) if (i == 0 || i == n - 1 || deg[i] != 2) isJ[i] = 1;
vector<char> used(m, 0);
unordered_map<unsigned long long, ld> invsum;
invsum.reserve(m * 2);
bool qJ = isJ[q];
int qs = -1, qt = -1;
ld qd = 0.0L, qL = 0.0L;
for (int u = 0; u < n; u++)
if (isJ[u]) {
for (auto [v,eid]: adj[u]) {
if (used[eid]) continue;
int cur = v, pe = eid;
ld L = edges[eid].w;
used[eid] = 1;
if (!qJ && cur == q && qs == -1) {
qs = u;
qd = L;
}
while (!isJ[cur]) {
int ne = -1, nx = -1;
for (auto [nb,id]: adj[cur])
if (id != pe) {
ne = id;
nx = nb;
break;
}
if (ne == -1) break;
L += edges[ne].w;
used[ne] = 1;
if (!qJ && nx == q && qs == -1) {
qs = u;
qd = L;
}
pe = ne;
cur = nx;
}
int a = u, b = cur;
if (a > b) swap(a, b);
unsigned long long key = ((unsigned long long) a << 32) | (unsigned int) b;
invsum[key] += 1.0L / L;
if (qs == u && qt == -1) {
qt = cur;
qL = L;
}
}
}
vector<vector<pair<int, ld> > > G(n);
G.reserve(n);
for (auto &kv: invsum) {
unsigned long long key = kv.first;
ld Req = 1.0L / kv.second;
int a = (int) (key >> 32), b = (int) (key & 0xffffffffu);
G[a].push_back({b, Req});
G[b].push_back({a, Req});
}
vector<int> nodes;
vector<ld> er;
int prev = -1, cur = 0;
nodes.push_back(0);
while (cur != n - 1) {
auto &nbr = G[cur];
int nxt = -1;
ld R = 0;
for (auto [x,r]: nbr)
if (x != prev) {
nxt = x;
R = r;
break;
}
if (nxt == -1) {
nxt = nbr[0].first;
R = nbr[0].second;
}
er.push_back(R);
nodes.push_back(nxt);
prev = cur;
cur = nxt;
}
int k = nodes.size();
vector<ld> pref(k, 0.0L);
for (int i = 1; i < k; i++) pref[i] = pref[i - 1] + er[i - 1];
ld Rtot = pref.back();
ld RtoQ = 0.0L;
if (isJ[q]) {
int idx = -1;
for (int i = 0; i < k; i++)
if (nodes[i] == q) {
idx = i;
break;
}
RtoQ = pref[idx];
} else {
int is = -1, it = -1;
for (int i = 0; i < k; i++) {
if (nodes[i] == qs) is = i;
if (nodes[i] == qt) it = i;
}
if (is < it) RtoQ = pref[is] + qd;
else RtoQ = pref[it] + (qL - qd);
}
ld I = (ld) V / Rtot;
ld Vq = (ld) V - I * RtoQ;
cout.setf(std::ios::fixed);
cout << setprecision(10) << (double) Vq << "\n";
return 0;
}
LyoKICogQXV0aG9yICAgIDogQXB1IERhcyBPcmdobwogKiBQcm9ibGVtICAgOiBTZXJpZXMtUGFyYWxsZWwgVm9sdGFnZSBDYWxjdWxhdG9yCiAqIENyZWF0ZWQgb246IDI3LTA5LTIwMjUKICovCiNpbmNsdWRlIDxiaXRzL3N0ZGMrKy5oPgojZGVmaW5lIGlhbXNwZWVkIGlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpO2Npbi50aWUoTlVMTCk7Y291dC50aWUoTlVMTCk7CiNkZWZpbmUgZW5kbCAnXG4nCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnVzaW5nIGxsID0gbG9uZyBsb25nOwp1c2luZyBsZCA9IGxvbmcgZG91YmxlOwoKc3RydWN0IEUgewogICAgaW50IGEsIGI7CiAgICBsbCB3Owp9OwoKaW50IG1haW4oKSB7CiAgICBpYW1zcGVlZAogICAgaW50IG4sIG07CiAgICBsbCBWOwogICAgaWYgKCEoY2luID4+IG4gPj4gbSA+PiBWKSkgcmV0dXJuIDA7CiAgICB2ZWN0b3I8RT4gZWRnZXMobSk7CiAgICB2ZWN0b3I8dmVjdG9yPHBhaXI8aW50LCBpbnQ+ID4gPiBhZGoobik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG07IGkrKykgewogICAgICAgIGludCBhLCBiOwogICAgICAgIGxsIGM7CiAgICAgICAgY2luID4+IGEgPj4gYiA+PiBjOwogICAgICAgIGVkZ2VzW2ldID0ge2EsIGIsIGN9OwogICAgICAgIGFkalthXS5wdXNoX2JhY2soe2IsIGl9KTsKICAgICAgICBhZGpbYl0ucHVzaF9iYWNrKHthLCBpfSk7CiAgICB9CiAgICBpbnQgcTsKICAgIGNpbiA+PiBxOwogICAgaWYgKHEgPT0gMCkgewogICAgICAgIGNvdXQuc2V0ZihzdGQ6Omlvczo6Zml4ZWQpOwogICAgICAgIGNvdXQgPDwgc2V0cHJlY2lzaW9uKDEwKSA8PCAobGQpIFYgPDwgIlxuIjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KICAgIGlmIChxID09IG4gLSAxKSB7CiAgICAgICAgY291dC5zZXRmKHN0ZDo6aW9zOjpmaXhlZCk7CiAgICAgICAgY291dCA8PCBzZXRwcmVjaXNpb24oMTApIDw8IDAuMEwgPDwgIlxuIjsKICAgICAgICByZXR1cm4gMDsKICAgIH0KCiAgICB2ZWN0b3I8aW50PiBkZWcobik7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgZGVnW2ldID0gYWRqW2ldLnNpemUoKTsKICAgIHZlY3RvcjxjaGFyPiBpc0oobiwgMCk7CiAgICBmb3IgKGludCBpID0gMDsgaSA8IG47IGkrKykgaWYgKGkgPT0gMCB8fCBpID09IG4gLSAxIHx8IGRlZ1tpXSAhPSAyKSBpc0pbaV0gPSAxOwoKICAgIHZlY3RvcjxjaGFyPiB1c2VkKG0sIDApOwogICAgdW5vcmRlcmVkX21hcDx1bnNpZ25lZCBsb25nIGxvbmcsIGxkPiBpbnZzdW07CiAgICBpbnZzdW0ucmVzZXJ2ZShtICogMik7CiAgICBib29sIHFKID0gaXNKW3FdOwogICAgaW50IHFzID0gLTEsIHF0ID0gLTE7CiAgICBsZCBxZCA9IDAuMEwsIHFMID0gMC4wTDsKCiAgICBmb3IgKGludCB1ID0gMDsgdSA8IG47IHUrKykKICAgICAgICBpZiAoaXNKW3VdKSB7CiAgICAgICAgICAgIGZvciAoYXV0byBbdixlaWRdOiBhZGpbdV0pIHsKICAgICAgICAgICAgICAgIGlmICh1c2VkW2VpZF0pIGNvbnRpbnVlOwogICAgICAgICAgICAgICAgaW50IGN1ciA9IHYsIHBlID0gZWlkOwogICAgICAgICAgICAgICAgbGQgTCA9IGVkZ2VzW2VpZF0udzsKICAgICAgICAgICAgICAgIHVzZWRbZWlkXSA9IDE7CiAgICAgICAgICAgICAgICBpZiAoIXFKICYmIGN1ciA9PSBxICYmIHFzID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcXMgPSB1OwogICAgICAgICAgICAgICAgICAgIHFkID0gTDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHdoaWxlICghaXNKW2N1cl0pIHsKICAgICAgICAgICAgICAgICAgICBpbnQgbmUgPSAtMSwgbnggPSAtMTsKICAgICAgICAgICAgICAgICAgICBmb3IgKGF1dG8gW25iLGlkXTogYWRqW2N1cl0pCiAgICAgICAgICAgICAgICAgICAgICAgIGlmIChpZCAhPSBwZSkgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgbmUgPSBpZDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIG54ID0gbmI7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGlmIChuZSA9PSAtMSkgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgTCArPSBlZGdlc1tuZV0udzsKICAgICAgICAgICAgICAgICAgICB1c2VkW25lXSA9IDE7CiAgICAgICAgICAgICAgICAgICAgaWYgKCFxSiAmJiBueCA9PSBxICYmIHFzID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgICAgIHFzID0gdTsKICAgICAgICAgICAgICAgICAgICAgICAgcWQgPSBMOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwZSA9IG5lOwogICAgICAgICAgICAgICAgICAgIGN1ciA9IG54OwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgaW50IGEgPSB1LCBiID0gY3VyOwogICAgICAgICAgICAgICAgaWYgKGEgPiBiKSBzd2FwKGEsIGIpOwogICAgICAgICAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGtleSA9ICgodW5zaWduZWQgbG9uZyBsb25nKSBhIDw8IDMyKSB8ICh1bnNpZ25lZCBpbnQpIGI7CiAgICAgICAgICAgICAgICBpbnZzdW1ba2V5XSArPSAxLjBMIC8gTDsKICAgICAgICAgICAgICAgIGlmIChxcyA9PSB1ICYmIHF0ID09IC0xKSB7CiAgICAgICAgICAgICAgICAgICAgcXQgPSBjdXI7CiAgICAgICAgICAgICAgICAgICAgcUwgPSBMOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQoKICAgIHZlY3Rvcjx2ZWN0b3I8cGFpcjxpbnQsIGxkPiA+ID4gRyhuKTsKICAgIEcucmVzZXJ2ZShuKTsKICAgIGZvciAoYXV0byAma3Y6IGludnN1bSkgewogICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBrZXkgPSBrdi5maXJzdDsKICAgICAgICBsZCBSZXEgPSAxLjBMIC8ga3Yuc2Vjb25kOwogICAgICAgIGludCBhID0gKGludCkgKGtleSA+PiAzMiksIGIgPSAoaW50KSAoa2V5ICYgMHhmZmZmZmZmZnUpOwogICAgICAgIEdbYV0ucHVzaF9iYWNrKHtiLCBSZXF9KTsKICAgICAgICBHW2JdLnB1c2hfYmFjayh7YSwgUmVxfSk7CiAgICB9CgogICAgdmVjdG9yPGludD4gbm9kZXM7CiAgICB2ZWN0b3I8bGQ+IGVyOwogICAgaW50IHByZXYgPSAtMSwgY3VyID0gMDsKICAgIG5vZGVzLnB1c2hfYmFjaygwKTsKICAgIHdoaWxlIChjdXIgIT0gbiAtIDEpIHsKICAgICAgICBhdXRvICZuYnIgPSBHW2N1cl07CiAgICAgICAgaW50IG54dCA9IC0xOwogICAgICAgIGxkIFIgPSAwOwogICAgICAgIGZvciAoYXV0byBbeCxyXTogbmJyKQogICAgICAgICAgICBpZiAoeCAhPSBwcmV2KSB7CiAgICAgICAgICAgICAgICBueHQgPSB4OwogICAgICAgICAgICAgICAgUiA9IHI7CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgIGlmIChueHQgPT0gLTEpIHsKICAgICAgICAgICAgbnh0ID0gbmJyWzBdLmZpcnN0OwogICAgICAgICAgICBSID0gbmJyWzBdLnNlY29uZDsKICAgICAgICB9CiAgICAgICAgZXIucHVzaF9iYWNrKFIpOwogICAgICAgIG5vZGVzLnB1c2hfYmFjayhueHQpOwogICAgICAgIHByZXYgPSBjdXI7CiAgICAgICAgY3VyID0gbnh0OwogICAgfQoKICAgIGludCBrID0gbm9kZXMuc2l6ZSgpOwogICAgdmVjdG9yPGxkPiBwcmVmKGssIDAuMEwpOwogICAgZm9yIChpbnQgaSA9IDE7IGkgPCBrOyBpKyspIHByZWZbaV0gPSBwcmVmW2kgLSAxXSArIGVyW2kgLSAxXTsKICAgIGxkIFJ0b3QgPSBwcmVmLmJhY2soKTsKCiAgICBsZCBSdG9RID0gMC4wTDsKICAgIGlmIChpc0pbcV0pIHsKICAgICAgICBpbnQgaWR4ID0gLTE7CiAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBrOyBpKyspCiAgICAgICAgICAgIGlmIChub2Rlc1tpXSA9PSBxKSB7CiAgICAgICAgICAgICAgICBpZHggPSBpOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICBSdG9RID0gcHJlZltpZHhdOwogICAgfSBlbHNlIHsKICAgICAgICBpbnQgaXMgPSAtMSwgaXQgPSAtMTsKICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGs7IGkrKykgewogICAgICAgICAgICBpZiAobm9kZXNbaV0gPT0gcXMpIGlzID0gaTsKICAgICAgICAgICAgaWYgKG5vZGVzW2ldID09IHF0KSBpdCA9IGk7CiAgICAgICAgfQogICAgICAgIGlmIChpcyA8IGl0KSBSdG9RID0gcHJlZltpc10gKyBxZDsKICAgICAgICBlbHNlIFJ0b1EgPSBwcmVmW2l0XSArIChxTCAtIHFkKTsKICAgIH0KCiAgICBsZCBJID0gKGxkKSBWIC8gUnRvdDsKICAgIGxkIFZxID0gKGxkKSBWIC0gSSAqIFJ0b1E7CiAgICBjb3V0LnNldGYoc3RkOjppb3M6OmZpeGVkKTsKICAgIGNvdXQgPDwgc2V0cHJlY2lzaW9uKDEwKSA8PCAoZG91YmxlKSBWcSA8PCAiXG4iOwogICAgcmV0dXJuIDA7Cn0K