#include <bits/stdc++.h>   using namespace std;   template <typename T>   inline T smin(T &a, const T &b) {     return a > b ? a = b : a;   }   template <typename T>   inline T smax(T &a, const T &b) {     return a < b ? a = b : a;   }   inline void add(long long &l, const long long &r) {     l = (l + r) % (long long)10139;   }   long long gcd(long long v, long long u) { return u ? gcd(u, v % u) : v; }   long long po(long long v, long long u) {     return u ? (po(v * v % (long long)10139, u >> 1) * (u & 1 ? v : 1) %                 (long long)10139)              : 1;   }   int n, m;   int p[200010];   pair<long long, pair<int, int>> ed[200010];   vector<int> adj[200010];   const int lca_LG = 20;   int lca_par[lca_LG][200010], lca_level[200010], lca_cost[lca_LG][200010];   inline int oo(int v, int u) {     return ed[v].second.second + ed[v].second.first - u;   }   void lca_dfs(int lca_v, int lca_papa = 0) {     lca_par[0][lca_v] = lca_papa;     lca_level[lca_v] = lca_level[lca_papa] + 1;     for (auto lca_e : adj[lca_v]) {       if (oo(lca_e, lca_v) != lca_papa) {         lca_cost[0][oo(lca_e, lca_v)] = ed[lca_e].first;         lca_dfs(oo(lca_e, lca_v), lca_v);       }     }   }   int get_lca(int lca_v, int lca_u) {     int res = 0;     if (lca_level[lca_v] < lca_level[lca_u]) {       swap(lca_v, lca_u);     }     for (int i = lca_LG - 1; ~i; i--) {       if (lca_level[lca_par[i][lca_v]] >= lca_level[lca_u]) {         smax(res, lca_cost[i][lca_v]);         lca_v = lca_par[i][lca_v];       }     }     if (lca_v == lca_u) {       return res;     }     for (int i = lca_LG - 1; ~i; i--) {       if (lca_par[i][lca_v] != lca_par[i][lca_u]) {         smax(res, lca_cost[i][lca_v]);         smax(res, lca_cost[i][lca_u]);         lca_v = lca_par[i][lca_v];         lca_u = lca_par[i][lca_u];       }     }     smax(res, lca_cost[0][lca_v]);     smax(res, lca_cost[0][lca_u]);     return res;   }   int get_p(int v) {     if (p[v]) return p[v] = get_p(p[v]);     return v;   }   bool merge(int v, int u) {     v = get_p(v);     u = get_p(u);     if (v == u) return false;     p[v] = u;     return true;   }   int main() {     ios::sync_with_stdio(0);     cin.tie(0);     cout.tie(0);     cin >> n >> m;     for (int i = 0; i < m; i++)       cin >> ed[i].second.first >> ed[i].second.second >> ed[i].first;     sort(ed, ed + m);     long long nc = n, cost = 0;     for (int i = 0; i < m; i++) {       if (merge(ed[i].second.first, ed[i].second.second)) {         cost += ed[i].first;         nc--;         adj[ed[i].second.first].push_back(i);         adj[ed[i].second.second].push_back(i);       }     }     if (nc == 1) {       lca_dfs(1);       for (int i = 1; i < lca_LG; i++) {         for (int j = 1; j <= n; j++) {           lca_par[i][j] = lca_par[i - 1][lca_par[i - 1][j]];           lca_cost[i][j] =               max(lca_cost[i - 1][j], lca_cost[i - 1][lca_par[i - 1][j]]);         }       }     }     int q;     cin >> q;     while (q--) {       int v, u;       cin >> v >> u;       if (nc > 2) {         cout << -1 <<   n ;         continue;       }       if (nc == 2) {         if (get_p(v) == get_p(u)) {           cout << -1 <<   n ;           continue;         }         cout << cost <<   n ;         continue;       }       cout << cost - get_lca(v, u) <<   n ;     }     return 0;   }