// #pragma GCC target("avx2") #pragma GCC optimize("O3") // #pragma GCC optimize("unroll-loops") #include using namespace std; using P = pair; const int M = 998244353; const long long LM = 1LL << 60; int main() { cin.tie(0); ios::sync_with_stdio(0); int n, m; cin >> n >> m; vector>> edge(n); for (int i = 0; i < m; ++i) { int u, v; long long w; cin >> u >> v >> w; --u; --v; edge[u].emplace_back(w, v); } int k; cin >> k; unordered_map> banned; for (int i = 0; i < k; ++i) { int a, b, c; cin >> a >> b >> c; --a; --b; --c; if (!banned.count(a * (long long)M + b)) { banned[a * (long long)M + b] = unordered_set(); } banned[a * (long long)M + b].insert(c); } long long ans = -1; priority_queue, vector>, greater>> pq; pq.emplace(0LL, 0LL); while (!pq.empty()) { auto p = pq.top(); pq.pop(); int now = p.second % M; if (now == n - 1) { ans = p.first; break; } vector> rem; for (auto& e : edge[now]) { if (banned.count(p.second) && banned[p.second].count(e.second)) { rem.push_back(e); } else { pq.emplace(e.first + p.first, now * (long long)M + e.second); } } edge[now] = rem; } cout << ans << '\n'; return 0; }