#include<bits/stdc++.h>
using namespace std;
using dvec = vector<double>;
using svec = vector<string>;
using smat = vector<svec>;
class Solution {
class vars_map: public unordered_map<string,int> {
inline void add(const string& name) {
if (find(name) == end())
emplace(name,size()); }
public:
inline vars_map(const smat& equations) {
for (auto eq: equations)
for (int i = 0; i < 2; ++i)
add(eq[i]); }
inline int code(const string& name) const {
const auto it = find(name);
return it == end() ? -1 : it->second; } };
using idpair = pair<int,double>;
using idpvec = vector<idpair>;
using idpmat = vector<idpvec>;
class graph: idpmat {
using bvec = vector<bool>;
double compute(int u, int dest, bvec& visited, double ans) const {
if (visited[u] = true, dest == u)
return ans;
for (auto [v,w]: at(u))
if (visited[v])
continue;
else {
const auto a = compute(v,dest,visited,ans*w);
if (a != -1.0)
return a; }
visited[u] = false;
return -1.0; }
public:
inline graph(smat& equations, dvec& values, vars_map& var) :
idpmat(var.size()) {
for (int m = values.size(), i = 0; i < m; ++i) {
const auto& eq = equations[i];
const auto val = values[i];
const auto A = var[eq[0]];
const auto B = var[eq[1]];
at(A).emplace_back(B,1.0/val);
at(B).emplace_back(A,val); } }
inline double compute(int src, int dest) const {
if (src == -1 or dest == -1)
return -1.0;
bvec visited(size(),false);
return compute(src,dest,visited,1.0); } };
public:
inline dvec calcEquation(smat& equations, dvec& values, smat& queries) {
vars_map var(equations);
const graph g(equations,values,var);
dvec ans;
for (auto s: queries)
ans.push_back(g.compute(var.code(s[1]),var.code(s[0])));
return ans; } };
int main() {
const int P = 2;
int N, Q; cin.tie(nullptr)->sync_with_stdio(false), cin >> N >> Q;
smat equation(N,svec(P)), query(Q,svec(P));
dvec value(N);
for (int i = 0; i < N; ++i)
cin >> equation[i][0] >> equation[i][1] >> value[i];
for (int i = 0; i < Q; ++i)
cin >> query[i][0] >> query[i][1];
cout << fixed << setprecision(5);
for (auto ans: Solution().calcEquation(equation,value,query))
cout << ans << ' ';
return 0; }
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCnVzaW5nIGR2ZWMgPSB2ZWN0b3I8ZG91YmxlPjsKdXNpbmcgc3ZlYyA9IHZlY3RvcjxzdHJpbmc+Owp1c2luZyBzbWF0ID0gdmVjdG9yPHN2ZWM+OwoKY2xhc3MgU29sdXRpb24gewogICAgY2xhc3MgdmFyc19tYXA6IHB1YmxpYyB1bm9yZGVyZWRfbWFwPHN0cmluZyxpbnQ+IHsKICAgICAgICBpbmxpbmUgdm9pZCBhZGQoY29uc3Qgc3RyaW5nJiBuYW1lKSB7CiAgICAgICAgICAgIGlmIChmaW5kKG5hbWUpID09IGVuZCgpKQogICAgICAgICAgICAgICAgZW1wbGFjZShuYW1lLHNpemUoKSk7IH0KICAgIHB1YmxpYzoKICAgICAgICBpbmxpbmUgdmFyc19tYXAoY29uc3Qgc21hdCYgZXF1YXRpb25zKSB7CiAgICAgICAgICAgIGZvciAoYXV0byBlcTogZXF1YXRpb25zKQogICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCAyOyArK2kpCiAgICAgICAgICAgICAgICAgICAgYWRkKGVxW2ldKTsgfQogICAgICAgIGlubGluZSBpbnQgY29kZShjb25zdCBzdHJpbmcmIG5hbWUpIGNvbnN0IHsKICAgICAgICAgICAgY29uc3QgYXV0byBpdCA9IGZpbmQobmFtZSk7CiAgICAgICAgICAgIHJldHVybiBpdCA9PSBlbmQoKSA/IC0xIDogaXQtPnNlY29uZDsgfSB9OwoJdXNpbmcgaWRwYWlyID0gcGFpcjxpbnQsZG91YmxlPjsKCXVzaW5nIGlkcHZlYyA9IHZlY3RvcjxpZHBhaXI+OwoJdXNpbmcgaWRwbWF0ID0gdmVjdG9yPGlkcHZlYz47CiAgICBjbGFzcyBncmFwaDogaWRwbWF0IHsKICAgIAl1c2luZyBidmVjID0gdmVjdG9yPGJvb2w+OwogICAgICAgIGRvdWJsZSBjb21wdXRlKGludCB1LCBpbnQgZGVzdCwgYnZlYyYgdmlzaXRlZCwgZG91YmxlIGFucykgY29uc3QgewogICAgICAgICAgICBpZiAodmlzaXRlZFt1XSA9IHRydWUsIGRlc3QgPT0gdSkKICAgICAgICAgICAgICAgIHJldHVybiBhbnM7CiAgICAgICAgICAgIGZvciAoYXV0byBbdix3XTogYXQodSkpCiAgICAgICAgICAgICAgICBpZiAodmlzaXRlZFt2XSkKICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgICAgIGVsc2UgewogICAgICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gYSA9IGNvbXB1dGUodixkZXN0LHZpc2l0ZWQsYW5zKncpOwogICAgICAgICAgICAgICAgICAgIGlmIChhICE9IC0xLjApCiAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBhOyB9CiAgICAgICAgICAgIHZpc2l0ZWRbdV0gPSBmYWxzZTsKICAgICAgICAgICAgcmV0dXJuIC0xLjA7IH0KICAgIHB1YmxpYzoKICAgICAgICBpbmxpbmUgZ3JhcGgoc21hdCYgZXF1YXRpb25zLCBkdmVjJiB2YWx1ZXMsIHZhcnNfbWFwJiB2YXIpIDoKICAgICAgICAgICAgaWRwbWF0KHZhci5zaXplKCkpIHsKICAgICAgICAgICAgZm9yIChpbnQgbSA9IHZhbHVlcy5zaXplKCksIGkgPSAwOyBpIDwgbTsgKytpKSB7CiAgICAgICAgICAgICAgICBjb25zdCBhdXRvJiBlcSA9IGVxdWF0aW9uc1tpXTsKICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gdmFsID0gdmFsdWVzW2ldOwogICAgICAgICAgICAgICAgY29uc3QgYXV0byBBID0gdmFyW2VxWzBdXTsKICAgICAgICAgICAgICAgIGNvbnN0IGF1dG8gQiA9IHZhcltlcVsxXV07CiAgICAgICAgICAgICAgICBhdChBKS5lbXBsYWNlX2JhY2soQiwxLjAvdmFsKTsKICAgICAgICAgICAgICAgIGF0KEIpLmVtcGxhY2VfYmFjayhBLHZhbCk7IH0gfQogICAgICAgIGlubGluZSBkb3VibGUgY29tcHV0ZShpbnQgc3JjLCBpbnQgZGVzdCkgY29uc3QgewogICAgICAgICAgICBpZiAoc3JjID09IC0xIG9yIGRlc3QgPT0gLTEpCiAgICAgICAgICAgICAgICByZXR1cm4gLTEuMDsKICAgICAgICAgICAgYnZlYyB2aXNpdGVkKHNpemUoKSxmYWxzZSk7CiAgICAgICAgICAgIHJldHVybiBjb21wdXRlKHNyYyxkZXN0LHZpc2l0ZWQsMS4wKTsgfSB9OwpwdWJsaWM6CiAgICBpbmxpbmUgZHZlYyBjYWxjRXF1YXRpb24oc21hdCYgZXF1YXRpb25zLCBkdmVjJiB2YWx1ZXMsIHNtYXQmIHF1ZXJpZXMpIHsKICAgICAgICB2YXJzX21hcCB2YXIoZXF1YXRpb25zKTsKICAgICAgICBjb25zdCBncmFwaCBnKGVxdWF0aW9ucyx2YWx1ZXMsdmFyKTsKICAgICAgICBkdmVjIGFuczsKICAgICAgICBmb3IgKGF1dG8gczogcXVlcmllcykKICAgICAgICAgICAgYW5zLnB1c2hfYmFjayhnLmNvbXB1dGUodmFyLmNvZGUoc1sxXSksdmFyLmNvZGUoc1swXSkpKTsKICAgICAgICByZXR1cm4gYW5zOyB9IH07CgppbnQgbWFpbigpIHsKICAgIGNvbnN0IGludCBQID0gMjsKICAgIGludCBOLCBROyBjaW4udGllKG51bGxwdHIpLT5zeW5jX3dpdGhfc3RkaW8oZmFsc2UpLCBjaW4gPj4gTiA+PiBROwogICAgc21hdCBlcXVhdGlvbihOLHN2ZWMoUCkpLCBxdWVyeShRLHN2ZWMoUCkpOwogICAgZHZlYyB2YWx1ZShOKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKQogICAgICAgIGNpbiA+PiBlcXVhdGlvbltpXVswXSA+PiBlcXVhdGlvbltpXVsxXSA+PiB2YWx1ZVtpXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUTsgKytpKQogICAgICAgIGNpbiA+PiBxdWVyeVtpXVswXSA+PiBxdWVyeVtpXVsxXTsKICAgIGNvdXQgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKDUpOwogICAgZm9yIChhdXRvIGFuczogU29sdXRpb24oKS5jYWxjRXF1YXRpb24oZXF1YXRpb24sdmFsdWUscXVlcnkpKQogICAgICAgIGNvdXQgPDwgYW5zIDw8ICcgJzsKICAgIHJldHVybiAwOyB9Cg==