#include<bits/stdc++.h>
using namespace std;
template<class X, class Y> void mini(X &x, const Y &y){
x = min(x, y);
}
template<class X, class Y> void maxi(X &x, const Y &y){
x = max(x, y);
}
typedef string str;
typedef long long ll;
typedef unsigned long long ull;
typedef __int128 i128;
typedef double db;
typedef long double ld;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<ld, ld> pldld;
typedef pair<db, db> pdd;
typedef pair<char, char> pcc;
typedef vector<int> vi;
typedef vector<ll> vl;
typedef vector<char> vc;
typedef vector<pii> vpii;
typedef vector<pll> vpll;
typedef vector<vector<int>> vii;
typedef vector<vector<ll>> vll;
typedef vector<vector<char>> vcc;
typedef map<int, int> mpii;
typedef map<ll, ll> mpll;
typedef set<int> si;
typedef set<ll> sl;
typedef complex<ld> cd;
#define se second
#define fi first
#define Rep(i, l, r, x) for(int i = l; i < (int)r; i += x)
#define Repd(i, l, r, x) for(int i = l; i > (int)r; i -= x)
#define For(i, l, r, x) for(int i = l; i <= (int)r; i += x)
#define Ford(i, l, r, x) for(int i = l; i >= (int)r; i -= x)
#define Fore(x, a) for(auto x: a)
#define pb push_back
#define pf push_front
#define ppb pop_back
#define ppf pop_front
#define ins insert
#define era erase
#define upb upper_bound
#define lwb lower_bound
#define all(a) a.begin(), a.end()
const db PI = acos(-1);
const ll inf = 1e18 + 1;
const int mod = 1e9 + 7;
const int maxn = 2e5 + 1;
int n, m, V;
int s, t;
vpii g[maxn];
ld d[maxn];
signed main(){
ios_base::sync_with_stdio(false);
cin.tie(nullptr); cout.tie(nullptr);
if(fopen("D:/inp.txt", "r"))
freopen("D:/inp.txt", "r", stdin),
freopen("D:/out.txt", "w", stdout);
cin >> n >> m >> V;
For(i, 1, m, 1){
int u, v, w; cin >> u >> v >> w;
g[u].pb({v, w}); g[v].pb({u, w});
}
cin >> s >> t;
fill(d, d + maxn, 1e18);
priority_queue<pair<ld, int>> pq;
d[s] = 0; pq.push({0, s});
while(pq.size()){
auto [du, u] = pq.top(); pq.pop();
if(-du > d[u]) continue;
for(auto [v, w]: g[u]){
ld wait = max(0, (int)(g[u].size()) - 2);
if(d[v] > d[u] + 1.0 * w / V + wait){
d[v] = d[u] + 1.0 * w / V + wait;
pq.push({-d[v], v});
}
}
}
cout << fixed << setprecision(6) << d[t];
cerr << "TIME ELAPSED: " << 1.0 * clock() / CLOCKS_PER_SEC << "s.\n";
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Cgp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZPiB2b2lkIG1pbmkoWCAmeCwgY29uc3QgWSAmeSl7Cgl4ID0gbWluKHgsIHkpOwp9Cgp0ZW1wbGF0ZTxjbGFzcyBYLCBjbGFzcyBZPiB2b2lkIG1heGkoWCAmeCwgY29uc3QgWSAmeSl7Cgl4ID0gbWF4KHgsIHkpOwp9Cgp0eXBlZGVmIHN0cmluZyBzdHI7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwp0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyB1bGw7CnR5cGVkZWYgX19pbnQxMjggaTEyODsKdHlwZWRlZiBkb3VibGUgZGI7CnR5cGVkZWYgbG9uZyBkb3VibGUgbGQ7CnR5cGVkZWYgcGFpcjxpbnQsIGludD4gcGlpOwp0eXBlZGVmIHBhaXI8bGwsIGxsPiBwbGw7CnR5cGVkZWYgcGFpcjxsZCwgbGQ+IHBsZGxkOwp0eXBlZGVmIHBhaXI8ZGIsIGRiPiBwZGQ7CnR5cGVkZWYgcGFpcjxjaGFyLCBjaGFyPiBwY2M7CnR5cGVkZWYgdmVjdG9yPGludD4gdmk7CnR5cGVkZWYgdmVjdG9yPGxsPiB2bDsKdHlwZWRlZiB2ZWN0b3I8Y2hhcj4gdmM7CnR5cGVkZWYgdmVjdG9yPHBpaT4gdnBpaTsKdHlwZWRlZiB2ZWN0b3I8cGxsPiB2cGxsOwp0eXBlZGVmIHZlY3Rvcjx2ZWN0b3I8aW50Pj4gdmlpOwp0eXBlZGVmIHZlY3Rvcjx2ZWN0b3I8bGw+PiB2bGw7CnR5cGVkZWYgdmVjdG9yPHZlY3RvcjxjaGFyPj4gdmNjOwp0eXBlZGVmIG1hcDxpbnQsIGludD4gbXBpaTsKdHlwZWRlZiBtYXA8bGwsIGxsPiBtcGxsOwp0eXBlZGVmIHNldDxpbnQ+IHNpOwp0eXBlZGVmIHNldDxsbD4gc2w7CnR5cGVkZWYgY29tcGxleDxsZD4gY2Q7CgojZGVmaW5lIHNlIHNlY29uZAojZGVmaW5lIGZpIGZpcnN0CiNkZWZpbmUgUmVwKGksIGwsIHIsIHgpIGZvcihpbnQgaSA9IGw7IGkgPCAoaW50KXI7IGkgKz0geCkKI2RlZmluZSBSZXBkKGksIGwsIHIsIHgpIGZvcihpbnQgaSA9IGw7IGkgPiAoaW50KXI7IGkgLT0geCkKI2RlZmluZSBGb3IoaSwgbCwgciwgeCkgZm9yKGludCBpID0gbDsgaSA8PSAoaW50KXI7IGkgKz0geCkKI2RlZmluZSBGb3JkKGksIGwsIHIsIHgpIGZvcihpbnQgaSA9IGw7IGkgPj0gKGludClyOyBpIC09IHgpCiNkZWZpbmUgRm9yZSh4LCBhKSBmb3IoYXV0byB4OiBhKQojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIHBmIHB1c2hfZnJvbnQKI2RlZmluZSBwcGIgcG9wX2JhY2sKI2RlZmluZSBwcGYgcG9wX2Zyb250CiNkZWZpbmUgaW5zIGluc2VydAojZGVmaW5lIGVyYSBlcmFzZQojZGVmaW5lIHVwYiB1cHBlcl9ib3VuZAojZGVmaW5lIGx3YiBsb3dlcl9ib3VuZAojZGVmaW5lIGFsbChhKSBhLmJlZ2luKCksIGEuZW5kKCkKCmNvbnN0IGRiIFBJID0gYWNvcygtMSk7CmNvbnN0IGxsIGluZiA9IDFlMTggKyAxOwpjb25zdCBpbnQgbW9kID0gMWU5ICsgNzsKY29uc3QgaW50IG1heG4gPSAyZTUgKyAxOwoKaW50IG4sIG0sIFY7CmludCBzLCB0Owp2cGlpIGdbbWF4bl07CmxkIGRbbWF4bl07CgpzaWduZWQgbWFpbigpewoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgljaW4udGllKG51bGxwdHIpOyBjb3V0LnRpZShudWxscHRyKTsKCWlmKGZvcGVuKCJEOi9pbnAudHh0IiwgInIiKSkKCQlmcmVvcGVuKCJEOi9pbnAudHh0IiwgInIiLCBzdGRpbiksCgkJZnJlb3BlbigiRDovb3V0LnR4dCIsICJ3Iiwgc3Rkb3V0KTsKCWNpbiA+PiBuID4+IG0gPj4gVjsKCUZvcihpLCAxLCBtLCAxKXsKCQlpbnQgdSwgdiwgdzsgY2luID4+IHUgPj4gdiA+PiB3OwoJCWdbdV0ucGIoe3YsIHd9KTsgZ1t2XS5wYih7dSwgd30pOwoJfQoJY2luID4+IHMgPj4gdDsKCWZpbGwoZCwgZCArIG1heG4sIDFlMTgpOwoJcHJpb3JpdHlfcXVldWU8cGFpcjxsZCwgaW50Pj4gcHE7CglkW3NdID0gMDsgcHEucHVzaCh7MCwgc30pOwoJd2hpbGUocHEuc2l6ZSgpKXsKCQlhdXRvIFtkdSwgdV0gPSBwcS50b3AoKTsgcHEucG9wKCk7CgkJaWYoLWR1ID4gZFt1XSkgY29udGludWU7CgkJZm9yKGF1dG8gW3YsIHddOiBnW3VdKXsKCQkJbGQgd2FpdCA9IG1heCgwLCAoaW50KShnW3VdLnNpemUoKSkgLSAyKTsKCQkJaWYoZFt2XSA+IGRbdV0gKyAxLjAgKiB3IC8gViArIHdhaXQpewoJCQkJZFt2XSA9IGRbdV0gKyAxLjAgKiB3IC8gViArIHdhaXQ7CgkJCQlwcS5wdXNoKHstZFt2XSwgdn0pOwoJCQl9CgkJfQoJfQoJY291dCA8PCBmaXhlZCA8PCBzZXRwcmVjaXNpb24oNikgPDwgZFt0XTsKCWNlcnIgPDwgIlRJTUUgRUxBUFNFRDogIiA8PCAxLjAgKiBjbG9jaygpIC8gQ0xPQ0tTX1BFUl9TRUMgPDwgInMuXG4iOwoJcmV0dXJuIDA7Cn0K