#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;
}
