#include<bits/stdc++.h>
using namespace std;
using dvec = vector<double>;
using svec = vector<string>;
using smat = vector<svec>;
template<class T, class U>
bool contains(T& container, const U& key) {
return container.find(key) != container.end(); }
struct Solution {
using sset = unordered_set<string>;
using sdpair = pair<string,double>;
using sdvec = vector<sdpair>;
using sdmap = unordered_map<string,sdvec>;
using squeue = queue<string>;
using dqueue = queue<double>;
double bfs(sdmap& mp, const string& src, const string& dest) {
squeue qvar;
dqueue qval;
sset visited;
const auto push = [&](const string& name, double value) {
qvar.push(name);
qval.push(value);
visited.insert(name); };
for (push(src,1.0); !qvar.empty(); qvar.pop(), qval.pop()) {
const auto x = qvar.front();
const auto v = qval.front();
for (auto [y,w]: mp[x])
if (!contains(visited,y)) {
const auto z = v*w;
if (y == dest)
return z;
push(y,z); } }
return -1.0; }
dvec calcEquation(smat& equations, dvec& values, smat& queries) {
const int N = equations.size(), Q = queries.size();
sdmap mp;
const auto add_equations = [&](string& A, string& B, double v) {
mp[B].emplace_back(A,v);
mp[A].emplace_back(B,1.0/v); };
for(int i = 0; i < N; ++i)
add_equations(equations[i][0],equations[i][1],values[i]);
dvec ans(Q);
for(int i = 0; i < Q; ++i) {
const auto &src = queries[i][1];
const auto &dest = queries[i][0];
if (!contains(mp,src) or !contains(mp,dest))
ans[i] = -1.0;
else if (src == dest)
ans[i] = 1.0;
else
ans[i] = bfs(mp,src,dest); }
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+OwoKdGVtcGxhdGU8Y2xhc3MgVCwgY2xhc3MgVT4KYm9vbCBjb250YWlucyhUJiBjb250YWluZXIsIGNvbnN0IFUmIGtleSkgewogICAgcmV0dXJuIGNvbnRhaW5lci5maW5kKGtleSkgIT0gY29udGFpbmVyLmVuZCgpOyB9CgpzdHJ1Y3QgU29sdXRpb24gewogICAgdXNpbmcgc3NldCAgID0gdW5vcmRlcmVkX3NldDxzdHJpbmc+OwogICAgdXNpbmcgc2RwYWlyID0gcGFpcjxzdHJpbmcsZG91YmxlPjsKICAgIHVzaW5nIHNkdmVjICA9IHZlY3RvcjxzZHBhaXI+OwogICAgdXNpbmcgc2RtYXAgID0gdW5vcmRlcmVkX21hcDxzdHJpbmcsc2R2ZWM+OwogICAgdXNpbmcgc3F1ZXVlID0gcXVldWU8c3RyaW5nPjsKICAgIHVzaW5nIGRxdWV1ZSA9IHF1ZXVlPGRvdWJsZT47ICAKICAgIGRvdWJsZSBiZnMoc2RtYXAmIG1wLCBjb25zdCBzdHJpbmcmIHNyYywgY29uc3Qgc3RyaW5nJiBkZXN0KSB7CiAgICAgICAgc3F1ZXVlIHF2YXI7IAogICAgICAgIGRxdWV1ZSBxdmFsOwogICAgICAgIHNzZXQgdmlzaXRlZDsgCiAgICAJY29uc3QgYXV0byBwdXNoID0gWyZdKGNvbnN0IHN0cmluZyYgbmFtZSwgZG91YmxlIHZhbHVlKSB7CiAgICAJCXF2YXIucHVzaChuYW1lKTsgCiAgICAgICAgICAgIHF2YWwucHVzaCh2YWx1ZSk7IAogICAgICAgICAgICB2aXNpdGVkLmluc2VydChuYW1lKTsgfTsKICAgIAlmb3IgKHB1c2goc3JjLDEuMCk7ICFxdmFyLmVtcHR5KCk7IHF2YXIucG9wKCksIHF2YWwucG9wKCkpIHsKICAgIAkJY29uc3QgYXV0byB4ID0gcXZhci5mcm9udCgpOwogICAgCQljb25zdCBhdXRvIHYgPSBxdmFsLmZyb250KCk7CiAgICAJCWZvciAoYXV0byBbeSx3XTogbXBbeF0pCiAgICAJCQlpZiAoIWNvbnRhaW5zKHZpc2l0ZWQseSkpIHsKICAgICAgICAgICAgCQljb25zdCBhdXRvIHogPSB2Knc7CiAgICAgICAgICAgIAkJaWYgKHkgPT0gZGVzdCkKICAgICAgICAgICAgICAgIAkJcmV0dXJuIHo7CiAgICAgICAgICAgIAkJcHVzaCh5LHopOyB9IH0KICAgIAlyZXR1cm4gLTEuMDsgfQogICAgZHZlYyBjYWxjRXF1YXRpb24oc21hdCYgZXF1YXRpb25zLCBkdmVjJiB2YWx1ZXMsIHNtYXQmIHF1ZXJpZXMpIHsKICAgICAgICBjb25zdCBpbnQgTiA9IGVxdWF0aW9ucy5zaXplKCksIFEgPSBxdWVyaWVzLnNpemUoKTsKICAgICAgICBzZG1hcCBtcDsgCiAgICAgICAgY29uc3QgYXV0byBhZGRfZXF1YXRpb25zID0gWyZdKHN0cmluZyYgQSwgc3RyaW5nJiBCLCBkb3VibGUgdikgewogICAgICAgIAltcFtCXS5lbXBsYWNlX2JhY2soQSx2KTsKICAgICAgICAgICAgbXBbQV0uZW1wbGFjZV9iYWNrKEIsMS4wL3YpOyB9OwogICAgICAgIGZvcihpbnQgaSA9IDA7IGkgPCBOOyArK2kpIAogICAgICAgIAlhZGRfZXF1YXRpb25zKGVxdWF0aW9uc1tpXVswXSxlcXVhdGlvbnNbaV1bMV0sdmFsdWVzW2ldKTsKICAgICAgICBkdmVjIGFucyhRKTsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgUTsgKytpKSB7CiAgICAgICAgCWNvbnN0IGF1dG8gICZzcmMgPSBxdWVyaWVzW2ldWzFdOyAKICAgICAgICAgICAgY29uc3QgYXV0byAmZGVzdCA9IHF1ZXJpZXNbaV1bMF07CiAgICAgICAgCWlmICghY29udGFpbnMobXAsc3JjKSBvciAhY29udGFpbnMobXAsZGVzdCkpCiAgICAgICAgICAgIAlhbnNbaV0gPSAtMS4wOwogICAgICAgICAgICBlbHNlIGlmIChzcmMgPT0gZGVzdCkKICAgICAgICAgICAgCWFuc1tpXSA9IDEuMDsgIAkKICAgICAgICAgICAgZWxzZSAKICAgICAgICAgICAgCWFuc1tpXSA9IGJmcyhtcCxzcmMsZGVzdCk7IH0KICAgICAgICByZXR1cm4gYW5zOyB9IH07CgppbnQgbWFpbigpIHsKICAgIGNvbnN0IGludCBQID0gMjsKICAgIGludCBOLCBROyBjaW4udGllKG51bGxwdHIpLT5zeW5jX3dpdGhfc3RkaW8oZmFsc2UpLCBjaW4gPj4gTiA+PiBROwogICAgc21hdCBlcXVhdGlvbihOLHN2ZWMoUCkpLCBxdWVyeShRLHN2ZWMoUCkpOwogICAgZHZlYyB2YWx1ZShOKTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgTjsgKytpKQogICAgICAgIGNpbiA+PiBlcXVhdGlvbltpXVswXSA+PiBlcXVhdGlvbltpXVsxXSA+PiB2YWx1ZVtpXTsKICAgIGZvciAoaW50IGkgPSAwOyBpIDwgUTsgKytpKQogICAgICAgIGNpbiA+PiBxdWVyeVtpXVswXSA+PiBxdWVyeVtpXVsxXTsKICAgIGNvdXQgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKDUpOwogICAgZm9yIChhdXRvIGFuczogU29sdXRpb24oKS5jYWxjRXF1YXRpb24oZXF1YXRpb24sdmFsdWUscXVlcnkpKQogICAgICAgIGNvdXQgPDwgYW5zIDw8ICcgJzsKICAgIHJldHVybiAwOyB9CiAgICA=