#include using namespace std; template int size(const T &x) { return x.size(); } #define rep(i,a,b) for (auto i=(a); i<(b); ++i) #define iter(it,c) for (auto it = (c).begin(); it != (c).end(); ++it) typedef pair ii; typedef vector vi; typedef vector vii; typedef vector vvi; typedef long long ll; const int INF = 1000000000; int dist[100][100]; int n; vector > del; bool del_cmp(const pair &a, const pair &b) { return a.second.first < b.second.first; } map, int> mem; int dp(int at, int t, int done, int have) { pair st(ii(at,t), ii(done,have)); if (mem.find(st) != mem.end()) return mem[st]; if (done == (1<= del[i].second.second && (((done | have) & (1<> n >> m; rep(i,0,n) { rep(j,0,n) { dist[i][j] = i == j ? 0 : INF; } } rep(i,0,m) { int a, b, c; cin >> a >> b >> c; a--, b--; dist[a][b] = min(dist[a][b], c); dist[b][a] = min(dist[b][a], c); } rep(k,0,n) { rep(i,0,n) { rep(j,0,n) { dist[i][j] = min(dist[i][j], dist[i][k] + dist[k][j]); } } } rep(i,0,n) { rep(j,0,n) { assert(dist[i][j] != INF); } } int qs; cin >> qs; rep(q,0,qs) { int u, s, t; // cin >> u >> s >> t; cin >> s >> u >> t; u--; del.push_back(make_pair(u, ii(s,t))); } sort(del.begin(), del.end(), del_cmp); rep(i,0,size(del)) { assert(del[i].second.first <= del[i].second.second); } rep(i,0,size(del)-1) { assert(del[i].second.first < del[i+1].second.first); assert(del[i].second.second < del[i+1].second.second); } cout << dp(0, 0, 0, 0) << endl; return 0; }