1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const int N = 1e2;

int t, n, m, p[N + 1], a, b, w, updates;
vector<pair<int, ll>> G[N + 1];
set <ll> old_vals[N + 1], new_vals[N + 1], temp;

void update() {
    for(int i = 1 ; i <= n ; i++) {
        temp = new_vals[i];
        old_vals[i].insert(new_vals[i].begin(), new_vals[i].end());
        new_vals[i].clear();
        for(auto val : temp) {
            for(auto edge : G[i]) {
                ll new_val = val * edge.second;
                if(new_val <= p[edge.first] && old_vals[edge.first].find(new_val) == old_vals[edge.first].end() && new_vals[edge.first].find(new_val) == new_vals[edge.first].end()) {
                    new_vals[edge.first].insert(new_val);
                    updates++;
                }
            }
        }
    }
}

int main() {
    cin>>t;
    while(t--) {
        cin>>n>>m;
        for(int i = 1 ; i <= n ; i++) {
            G[i].clear();
            old_vals[i].clear();
            new_vals[i].clear();
            cin >> p[i];
        }

        for(int i = 1 ; i <= m ; i++) {
            cin>>a>>b>>w;
            G[a].push_back({b, w});
        }

        new_vals[1].insert(1);

        updates = 1;
        while(updates) {
            updates = 0;
            update();
        }
        if(!old_vals[n].empty()){
            ll max_val = *old_vals[n].rbegin();
            cout<<max_val<<"\n";
        }
        else cout<<"-1\n";
    }
}