#include <bits/stdc++.h>
using namespace std;
typedef pair<int,int> ii;
typedef pair<long long, ii> iii;
class UnionFindDS{
private:
vector<int> p, sz; // parent, size
int num;
public:
UnionFindDS(int N){
p.assign(N,0); for (int i = 0; i < N; i++) p[i] = i;
sz.assign(N,1); num = N;
}
int numSets(){ return num; }
int findSet(int i){ return p[i] == i ? i : p[i] = findSet(p[i]); }
int sizeSet(int i){ return sz[findSet(i)]; }
bool isSameSet(int i, int j){ return findSet(i) == findSet(j); }
void unionSet(int i, int j){
if ((i = findSet(i)) == (j = findSet(j))) return;
num--;
p[j] = i; sz[i] += sz[j];
}
};
int N, M, Q;
vector<iii> edge;
int main() {
scanf("%d%d", &N, &M);
for (int i = 0, u, v; i < M; i++) {
long long w;
scanf("%d%d%lld", &u, &v, &w);
edge.push_back(iii(w, ii(u, v)));
}
sort(edge.begin(), edge.end());
scanf("%d", &Q);
for (int i = 0, u, v; i < Q; i++) {
scanf("%d%d", &u, &v);
UnionFindDS uf(N+1);
uf.unionSet(u, v);
long long ans = 0;
for (int i = 0; i < edge.size(); i++) {
long long w = edge[i].first;
long long u = edge[i].second.first;
long long v = edge[i].second.second;
if (uf.isSameSet(u, v)) continue;
uf.unionSet(u, v); ans += w;
}
printf("%lld\n", ans);
}
return 0;
}