#include <bits/stdc++.h>   using namespace std;   const long long maxn = 1e5, maxl = 20;   bool mark[maxn];   long long sum = 0, cmp, d[maxn];   pair<long long, long long> par[maxn][maxl];   vector<pair<long long, long long> > adj[maxn];   struct Type_Dsu {     long long par[maxn], h[maxn];     void make_set(long long x) {       par[x] = x;       h[x] = 0;     }     long long findpar(long long x) {       return par[x] = (x == par[x] ? x : findpar(par[x]));     }     bool merge(long long x, long long y) {       x = findpar(x);       y = findpar(y);       if (x == y) return false;       if (d[x] > d[y]) swap(x, y);       par[x] = y;       h[y] += (h[x] == h[y]);       return true;     }     bool same(long long x, long long y) { return (findpar(x) == findpar(y)); }   } dsu;   struct Edge {     long long fi, se, w;   };   vector<Edge> edges;   void input() {     long long n, m;     cin >> n >> m;     cmp = n;     for (long long i = 0; i < n; i++) dsu.make_set(i);     for (long long i = 0; i < m; i++) {       long long fi, se, w;       cin >> fi >> se >> w;       fi--;       se--;       Edge edg;       edg.fi = fi;       edg.se = se;       edg.w = w;       edges.push_back(edg);     }   }   bool comp(Edge a, Edge b) { return (a.w < b.w); }   void mst() {     sort(edges.begin(), edges.end(), comp);     for (long long i = 0; i < edges.size(); i++) {       long long fi = edges[i].fi, se = edges[i].se, w = edges[i].w;       if (!dsu.same(fi, se)) {         cmp--;         sum += w;         dsu.merge(fi, se);         adj[fi].push_back(make_pair(w, se));         adj[se].push_back(make_pair(w, fi));       }     }   }   void dfs(long long x) {     mark[x] = true;     for (long long i = 0; i < adj[x].size(); i++) {       long long child = adj[x][i].second, w = adj[x][i].first;       if (mark[child]) continue;       par[child][0] = make_pair(x, w);       d[child] = d[x] + 1;       for (long long j = 1; j < maxl; j++) {         long long p = par[par[child][j - 1].first][j - 1].first;         long long maxe = max(par[child][j - 1].second,                              par[par[child][j - 1].first][j - 1].second);         par[child][j] = make_pair(p, maxe);       }       dfs(child);     }   }   pair<long long, long long> findpar(long long x, long long d) {     long long p = x, maxe = 0;     for (long long i = 0; i < maxl; i++)       if ((d >> i) & 1) {         maxe = max(maxe, par[p][i].second);         p = par[p][i].first;       }     return make_pair(p, maxe);   }   long long lca(long long x, long long y) {     long long maxe = 0;     if (d[x] > d[y]) swap(x, y);     maxe = findpar(y, d[y] - d[x]).second;     y = findpar(y, d[y] - d[x]).first;     if (x == y) return maxe;     for (long long i = maxl - 1; i >= 0; i--)       if (par[x][i].first != par[y][i].first) {         maxe = max(maxe, par[x][i].second);         maxe = max(maxe, par[y][i].second);         x = par[x][i].first;         y = par[y][i].first;       }     maxe = max(maxe, par[x][0].second);     maxe = max(maxe, par[y][0].second);     return maxe;   }   void output() {     long long q;     cin >> q;     for (long long i = 0; i < q; i++) {       long long A, B;       cin >> A >> B;       A--;       B--;       cout << endl;       if (cmp > 2) cout << -1 << endl;       if (cmp == 2)         if (dsu.same(A, B))           cout << -1 << endl;         else           cout << sum << endl;       if (cmp == 1) cout << sum - lca(A, B) << endl;     }   }   int main() {     ios_base::sync_with_stdio(false);     input();     mst();     dfs(0);     output();     return 0;   }