#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
double a;
string s;
ll N;
unordered_map<string, vector<ll>> m_base, m_quote;
vector<unordered_map<string, double>> dp;
vector<string> base, quote;
vector<double> p;
struct State {
ll idx;
string cur;
bool processing;
double val;
vector<ll>::iterator it, end;
double best;
};
double iterative_sol(ll start_idx, string &start_cur) {
stack<State> stk;
unordered_map<string, double> memo;
stk.push({start_idx, start_cur, false, 0.0, {}, {}, 0.0});
while (!stk.empty()) {
auto &state = stk.top();
if (!state.processing) {
if (state.idx == N) {
double res = (state.cur == s) ? 1.0 : 0.0;
memo[state.cur] = res;
stk.pop();
continue;
}
auto it = dp[state.idx].find(state.cur);
if (it != dp[state.idx].end()) {
stk.pop();
continue;
}
state.best = (state.cur == s) ? 1.0 : 0.0;
state.processing = true;
if (m_base.count(state.cur)) {
auto &vec = m_base[state.cur];
state.it = lower_bound(vec.begin(), vec.end(), state.idx);
state.end = vec.end();
for (; state.it != state.end; ++state.it) {
ll j = *state.it;
if (j >= N) break;
stk.push({j + 1, quote[j], false, 0.0, {}, {}, 0.0});
}
state.it = lower_bound(vec.begin(), vec.end(), state.idx);
}
} else {
if (m_base.count(state.cur)) {
auto &vec = m_base[state.cur];
for (; state.it != state.end; ++state.it) {
ll j = *state.it;
if (j >= N) break;
auto it_memo = memo.find(quote[j]);
if (it_memo != memo.end()) {
state.best = max(state.best, p[j] * it_memo->second);
}
}
}
if (m_quote.count(state.cur)) {
auto &vec = m_quote[state.cur];
auto it_j = lower_bound(vec.begin(), vec.end(), state.idx);
for (; it_j != vec.end(); ++it_j) {
ll j = *it_j;
if (j >= N) break;
auto it_memo = memo.find(base[j]);
if (it_memo != memo.end()) {
state.best = max(state.best, (1.0 / p[j]) * it_memo->second);
}
}
}
dp[state.idx][state.cur] = state.best;
memo[state.cur] = state.best;
stk.pop();
}
}
return memo[start_cur];
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(nullptr);
cout.tie(nullptr);
// freopen("crypto.in", "r", stdin);
ll t;
cin >> t;
while (t--) {
cin >> a >> s >> N;
m_base.clear();
m_quote.clear();
dp.assign(N + 1, unordered_map<string, double>());
base.resize(N);
quote.resize(N);
p.resize(N);
for (ll i = 0; i < N; ++i) {
cin >> base[i] >> quote[i] >> p[i];
m_base[base[i]].push_back(i);
m_quote[quote[i]].push_back(i);
}
for (auto &pair : m_base) sort(pair.second.begin(), pair.second.end());
for (auto &pair : m_quote) sort(pair.second.begin(), pair.second.end());
double ss = iterative_sol(0, s);
ss *= a;
cout << fixed << setprecision(6) << ss << "\n";
}
return 0;
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CnR5cGVkZWYgbG9uZyBsb25nIGxsOwoKZG91YmxlIGE7CnN0cmluZyBzOwpsbCBOOwp1bm9yZGVyZWRfbWFwPHN0cmluZywgdmVjdG9yPGxsPj4gbV9iYXNlLCBtX3F1b3RlOwp2ZWN0b3I8dW5vcmRlcmVkX21hcDxzdHJpbmcsIGRvdWJsZT4+IGRwOwp2ZWN0b3I8c3RyaW5nPiBiYXNlLCBxdW90ZTsKdmVjdG9yPGRvdWJsZT4gcDsKCnN0cnVjdCBTdGF0ZSB7CiAgICBsbCBpZHg7CiAgICBzdHJpbmcgY3VyOwogICAgYm9vbCBwcm9jZXNzaW5nOwogICAgZG91YmxlIHZhbDsKICAgIHZlY3RvcjxsbD46Oml0ZXJhdG9yIGl0LCBlbmQ7CiAgICBkb3VibGUgYmVzdDsKfTsKCmRvdWJsZSBpdGVyYXRpdmVfc29sKGxsIHN0YXJ0X2lkeCwgc3RyaW5nICZzdGFydF9jdXIpIHsKICAgIHN0YWNrPFN0YXRlPiBzdGs7CiAgICB1bm9yZGVyZWRfbWFwPHN0cmluZywgZG91YmxlPiBtZW1vOwoKICAgIHN0ay5wdXNoKHtzdGFydF9pZHgsIHN0YXJ0X2N1ciwgZmFsc2UsIDAuMCwge30sIHt9LCAwLjB9KTsKCiAgICB3aGlsZSAoIXN0ay5lbXB0eSgpKSB7CiAgICAgICAgYXV0byAmc3RhdGUgPSBzdGsudG9wKCk7CiAgICAgICAgaWYgKCFzdGF0ZS5wcm9jZXNzaW5nKSB7CiAgICAgICAgICAgIGlmIChzdGF0ZS5pZHggPT0gTikgewogICAgICAgICAgICAgICAgZG91YmxlIHJlcyA9IChzdGF0ZS5jdXIgPT0gcykgPyAxLjAgOiAwLjA7CiAgICAgICAgICAgICAgICBtZW1vW3N0YXRlLmN1cl0gPSByZXM7CiAgICAgICAgICAgICAgICBzdGsucG9wKCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBhdXRvIGl0ID0gZHBbc3RhdGUuaWR4XS5maW5kKHN0YXRlLmN1cik7CiAgICAgICAgICAgIGlmIChpdCAhPSBkcFtzdGF0ZS5pZHhdLmVuZCgpKSB7CiAgICAgICAgICAgICAgICBzdGsucG9wKCk7CiAgICAgICAgICAgICAgICBjb250aW51ZTsKICAgICAgICAgICAgfQogICAgICAgICAgICBzdGF0ZS5iZXN0ID0gKHN0YXRlLmN1ciA9PSBzKSA/IDEuMCA6IDAuMDsKICAgICAgICAgICAgc3RhdGUucHJvY2Vzc2luZyA9IHRydWU7CgogICAgICAgICAgICBpZiAobV9iYXNlLmNvdW50KHN0YXRlLmN1cikpIHsKICAgICAgICAgICAgICAgIGF1dG8gJnZlYyA9IG1fYmFzZVtzdGF0ZS5jdXJdOwogICAgICAgICAgICAgICAgc3RhdGUuaXQgPSBsb3dlcl9ib3VuZCh2ZWMuYmVnaW4oKSwgdmVjLmVuZCgpLCBzdGF0ZS5pZHgpOwogICAgICAgICAgICAgICAgc3RhdGUuZW5kID0gdmVjLmVuZCgpOwogICAgICAgICAgICAgICAgZm9yICg7IHN0YXRlLml0ICE9IHN0YXRlLmVuZDsgKytzdGF0ZS5pdCkgewogICAgICAgICAgICAgICAgICAgIGxsIGogPSAqc3RhdGUuaXQ7CiAgICAgICAgICAgICAgICAgICAgaWYgKGogPj0gTikgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgc3RrLnB1c2goe2ogKyAxLCBxdW90ZVtqXSwgZmFsc2UsIDAuMCwge30sIHt9LCAwLjB9KTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN0YXRlLml0ID0gbG93ZXJfYm91bmQodmVjLmJlZ2luKCksIHZlYy5lbmQoKSwgc3RhdGUuaWR4KTsKICAgICAgICAgICAgfQogICAgICAgIH0gZWxzZSB7CiAgICAgICAgICAgIGlmIChtX2Jhc2UuY291bnQoc3RhdGUuY3VyKSkgewogICAgICAgICAgICAgICAgYXV0byAmdmVjID0gbV9iYXNlW3N0YXRlLmN1cl07CiAgICAgICAgICAgICAgICBmb3IgKDsgc3RhdGUuaXQgIT0gc3RhdGUuZW5kOyArK3N0YXRlLml0KSB7CiAgICAgICAgICAgICAgICAgICAgbGwgaiA9ICpzdGF0ZS5pdDsKICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSBOKSBicmVhazsKICAgICAgICAgICAgICAgICAgICBhdXRvIGl0X21lbW8gPSBtZW1vLmZpbmQocXVvdGVbal0pOwogICAgICAgICAgICAgICAgICAgIGlmIChpdF9tZW1vICE9IG1lbW8uZW5kKCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGUuYmVzdCA9IG1heChzdGF0ZS5iZXN0LCBwW2pdICogaXRfbWVtby0+c2Vjb25kKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KCiAgICAgICAgICAgIGlmIChtX3F1b3RlLmNvdW50KHN0YXRlLmN1cikpIHsKICAgICAgICAgICAgICAgIGF1dG8gJnZlYyA9IG1fcXVvdGVbc3RhdGUuY3VyXTsKICAgICAgICAgICAgICAgIGF1dG8gaXRfaiA9IGxvd2VyX2JvdW5kKHZlYy5iZWdpbigpLCB2ZWMuZW5kKCksIHN0YXRlLmlkeCk7CiAgICAgICAgICAgICAgICBmb3IgKDsgaXRfaiAhPSB2ZWMuZW5kKCk7ICsraXRfaikgewogICAgICAgICAgICAgICAgICAgIGxsIGogPSAqaXRfajsKICAgICAgICAgICAgICAgICAgICBpZiAoaiA+PSBOKSBicmVhazsKICAgICAgICAgICAgICAgICAgICBhdXRvIGl0X21lbW8gPSBtZW1vLmZpbmQoYmFzZVtqXSk7CiAgICAgICAgICAgICAgICAgICAgaWYgKGl0X21lbW8gIT0gbWVtby5lbmQoKSkgewogICAgICAgICAgICAgICAgICAgICAgICBzdGF0ZS5iZXN0ID0gbWF4KHN0YXRlLmJlc3QsICgxLjAgLyBwW2pdKSAqIGl0X21lbW8tPnNlY29uZCk7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CgogICAgICAgICAgICBkcFtzdGF0ZS5pZHhdW3N0YXRlLmN1cl0gPSBzdGF0ZS5iZXN0OwogICAgICAgICAgICBtZW1vW3N0YXRlLmN1cl0gPSBzdGF0ZS5iZXN0OwogICAgICAgICAgICBzdGsucG9wKCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG1lbW9bc3RhcnRfY3VyXTsKfQoKaW50IG1haW4oKSB7CiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKGZhbHNlKTsKICAgIGNpbi50aWUobnVsbHB0cik7CiAgICBjb3V0LnRpZShudWxscHRyKTsKICAgIC8vIGZyZW9wZW4oImNyeXB0by5pbiIsICJyIiwgc3RkaW4pOwogICAgbGwgdDsKICAgIGNpbiA+PiB0OwogICAgd2hpbGUgKHQtLSkgewogICAgICAgIGNpbiA+PiBhID4+IHMgPj4gTjsKICAgICAgICBtX2Jhc2UuY2xlYXIoKTsKICAgICAgICBtX3F1b3RlLmNsZWFyKCk7CiAgICAgICAgZHAuYXNzaWduKE4gKyAxLCB1bm9yZGVyZWRfbWFwPHN0cmluZywgZG91YmxlPigpKTsKICAgICAgICBiYXNlLnJlc2l6ZShOKTsKICAgICAgICBxdW90ZS5yZXNpemUoTik7CiAgICAgICAgcC5yZXNpemUoTik7CiAgICAgICAgZm9yIChsbCBpID0gMDsgaSA8IE47ICsraSkgewogICAgICAgICAgICBjaW4gPj4gYmFzZVtpXSA+PiBxdW90ZVtpXSA+PiBwW2ldOwogICAgICAgICAgICBtX2Jhc2VbYmFzZVtpXV0ucHVzaF9iYWNrKGkpOwogICAgICAgICAgICBtX3F1b3RlW3F1b3RlW2ldXS5wdXNoX2JhY2soaSk7CiAgICAgICAgfQogICAgICAgIGZvciAoYXV0byAmcGFpciA6IG1fYmFzZSkgc29ydChwYWlyLnNlY29uZC5iZWdpbigpLCBwYWlyLnNlY29uZC5lbmQoKSk7CiAgICAgICAgZm9yIChhdXRvICZwYWlyIDogbV9xdW90ZSkgc29ydChwYWlyLnNlY29uZC5iZWdpbigpLCBwYWlyLnNlY29uZC5lbmQoKSk7CiAgICAgICAgZG91YmxlIHNzID0gaXRlcmF0aXZlX3NvbCgwLCBzKTsKICAgICAgICBzcyAqPSBhOwogICAgICAgIGNvdXQgPDwgZml4ZWQgPDwgc2V0cHJlY2lzaW9uKDYpIDw8IHNzIDw8ICJcbiI7CiAgICB9CiAgICByZXR1cm4gMDsKfQ==