#include <bits/stdc++.h>
using namespace std;
int h[100010];
int stramos[20][100010];
int maxstramos[20][100010];
vector<pair<int, int>> adia[100010];
int uf_g[100010], uf_tata[100010];
long long costact;
vector<pair<int, pair<int, int>>> wormholes;
int find(int x) {
  if (uf_tata[uf_tata[x]] != uf_tata[x]) uf_tata[x] = find(uf_tata[x]);
  return uf_tata[x];
}
void unite(int x, int y, int g) {
  if (find(x) != find(y)) {
    costact += g;
    adia[x].push_back({y, g});
    adia[y].push_back({x, g});
    x = find(x);
    y = find(y);
    if (uf_g[x] < uf_g[y]) swap(x, y);
    uf_tata[y] = x, uf_g[x] += uf_g[y];
  }
}
void dfs(int nod, int tata = 0) {
  h[nod] = 1 + h[tata];
  for (int i(1); i < 20; i++) {
    stramos[i][nod] = stramos[i - 1][stramos[i - 1][nod]];
    maxstramos[i][nod] =
        max(maxstramos[i - 1][nod], maxstramos[i - 1][stramos[i - 1][nod]]);
  }
  for (auto i : adia[nod]) {
    if (i.first == tata) continue;
    stramos[0][i.first] = nod;
    maxstramos[0][i.first] = i.second;
    dfs(i.first, nod);
  }
}
int lca(int a, int b) {
  int ans(0);
  if (h[a] < h[b]) swap(a, b);
  for (int i(19); i >= 0; i--)
    if (h[a] - (1 << i) >= h[b])
      ans = max(ans, maxstramos[i][a]), a = stramos[i][a];
  if (a == b) return ans;
  for (int i(19); i >= 0; i--) {
    if (stramos[i][a] != stramos[i][b]) {
      ans = max(ans, maxstramos[i][a]);
      ans = max(ans, maxstramos[i][b]);
      a = stramos[i][a];
      b = stramos[i][b];
    }
  }
  ans = max(ans, maxstramos[0][a]);
  ans = max(ans, maxstramos[0][b]);
  return ans;
}
int main() {
  int n, m;
  ios_base ::sync_with_stdio(0);
  cin.tie(0);
  cin >> n >> m;
  wormholes.resize(m);
  for (int i(0); i < m; i++)
    cin >> wormholes[i].second.first >> wormholes[i].second.second >>
        wormholes[i].first;
  for (int i(1); i <= n; i++) uf_g[i] = 1, uf_tata[i] = i;
  sort(wormholes.begin(), wormholes.end());
  for (auto i : wormholes) unite(i.second.first, i.second.second, i.first);
  vector<int> roots;
  for (int i(1); i <= n; i++)
    if (find(i) == i) roots.push_back(i);
  if (roots.size() > 2) {
    int q;
    cin >> q;
    while (q--) cout << "-1\n";
    return 0;
  }
  if (roots.size() == 2) {
    int q, a, b;
    cin >> q;
    while (q--) {
      cin >> a >> b;
      if (find(a) == find(b))
        cout << "-1\n";
      else
        cout << costact << '\n';
    }
    return 0;
  }
  dfs(1);
  int q, a, b;
  cin >> q;
  while (q--) {
    cin >> a >> b;
    cout << costact - lca(a, b) << '\n';
  }
  return 0;
}
