#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 10, M = 18;
pair<int, pair<int, int> > ed[maxn * 2];
vector<pair<int, int> > adj[maxn];
int p[maxn], par[M][maxn], mx[M][maxn], d[maxn];
int dad(int v) { return (p[v] == v ? v : p[v] = dad(p[v])); }
bool mrg(int u, int v) {
  u = dad(u), v = dad(v);
  if (u == v) return 0;
  p[u] = v;
  return 1;
}
void dfs(int v, int p, int we = 0) {
  mx[0][v] = we;
  par[0][v] = p;
  for (int i = 1; i < M; i++) {
    mx[i][v] = max(mx[i - 1][v], mx[i - 1][par[i - 1][v]]);
    par[i][v] = par[i - 1][par[i - 1][v]];
  }
  for (auto u : adj[v]) {
    if (u.first == p) continue;
    d[u.first] = d[v] + 1;
    dfs(u.first, v, u.second);
  }
}
int get_par(int v, int k) {
  for (int i = M; i--;)
    if (k & (1 << i)) v = par[i][v];
  return v;
}
int get_mx(int v, int k) {
  int ans = 0;
  for (int i = M; i--;)
    if (k & (1 << i)) {
      ans = max(ans, mx[i][v]);
      v = par[i][v];
    }
  return ans;
}
int lca(int u, int v) {
  if (d[u] > d[v]) swap(u, v);
  v = get_par(v, d[v] - d[u]);
  if (u == v) return v;
  for (int i = M; i--;)
    if (par[i][v] != par[i][u]) u = par[i][u], v = par[i][v];
  return par[0][v];
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int n, m;
  cin >> n >> m;
  for (int i = 0; i < n; i++) p[i] = i;
  for (int i = 0; i < m; i++) {
    int u, v, w;
    cin >> u >> v >> w;
    u--, v--;
    ed[i] = {w, {u, v}};
  }
  sort(ed, ed + m);
  long long sum = 0, c = n;
  for (int i = 0; i < m; i++) {
    int w = ed[i].first, u = ed[i].second.first, v = ed[i].second.second;
    if (mrg(u, v)) {
      c--;
      sum += w;
      adj[u].push_back({v, w});
      adj[v].push_back({u, w});
    }
  }
  for (int i = 0; i < n; i++)
    if (dad(i) == i) dfs(i, i);
  int q;
  cin >> q;
  while (q--) {
    int u, v;
    cin >> u >> v;
    u--, v--;
    if (c > 2 || (c == 2 && dad(u) == dad(v))) {
      cout << "-1\n";
      continue;
    }
    if (c == 2) {
      cout << sum << endl;
      continue;
    }
    int p = lca(u, v);
    cout << sum - max(get_mx(v, d[v] - d[p]), get_mx(u, d[u] - d[p])) << endl;
  }
}
