#include <bits/stdc++.h>
const int MAXN = 100 * 1000 + 11;
using namespace std;
int mark[MAXN], D[MAXN], par[MAXN][18], par1[MAXN][18];
vector<pair<int, int> > adj[MAXN], adj1[MAXN], a[MAXN];
vector<pair<int, pair<int, int> > > b, ar_a;
struct Type_DSU {
  int size[MAXN], par2[MAXN];
  void make_set(int x) {
    size[x] = 0;
    par2[x] = x;
  }
  int findPar(int x) { return par2[x] = (par2[x] == x ? x : findPar(par2[x])); }
  void merge(int x, int y) {
    x = findPar(x);
    y = findPar(y);
    if (x == y) return;
    if (size[y] > size[x]) swap(x, y);
    par2[y] = x;
    size[x] += (size[x] == size[y]);
    return;
  }
} DSU;
int dfs(int x) {
  mark[x] = 1;
  for (int i = 0; i < adj[x].size(); i++) {
    int pesar = adj[x][i].first;
    if (mark[pesar]) continue;
    D[pesar] = D[x] + 1;
    par[pesar][0] = x;
    par1[pesar][0] = adj[x][i].second;
    for (int j = 1; j < 18; j++) {
      par[pesar][j] = par[par[pesar][j - 1]][j - 1];
      par1[pesar][j] = max(par1[pesar][j - 1], par1[par[pesar][j - 1]][j - 1]);
    }
    dfs(pesar);
  }
  return 0;
}
pair<int, int> parent(int x, int d) {
  int y = 0;
  for (int i = 0; i < 18; i++)
    if ((d >> i) & 1) {
      y = max(y, par1[x][i]);
      x = par[x][i];
    }
  return make_pair(x, y);
}
int lca(int x, int y) {
  int z = 0;
  if (D[x] > D[y]) swap(x, y);
  z = parent(y, D[y] - D[x]).second;
  y = parent(y, D[y] - D[x]).first;
  if (x == y) {
    return z;
  }
  for (int i = 17; i >= 0; i--)
    if (par[x][i] != par[y][i]) {
      z = max(z, par1[x][i]);
      z = max(z, par1[y][i]);
      x = par[x][i];
      y = par[y][i];
    }
  z = max(z, par1[x][0]);
  z = max(z, par1[y][0]);
  return z;
}
int main() {
  ios_base::sync_with_stdio(false);
  long long n, m, q, s = 0, s1 = 0;
  cin >> n >> m;
  for (int i = 0; i < m; i++) {
    int t1, t2, t3;
    cin >> t1 >> t2 >> t3;
    ar_a.push_back(make_pair(t3, make_pair(t1, t2)));
    adj1[t1].push_back(make_pair(t2, t3));
    adj1[t2].push_back(make_pair(t1, t3));
  }
  sort(ar_a.begin(), ar_a.end());
  for (int i = 1; i <= n; i++) DSU.make_set(i);
  for (int i = 0; i < ar_a.size(); i++) {
    if (DSU.findPar(ar_a[i].second.first) !=
        DSU.findPar(ar_a[i].second.second)) {
      DSU.merge(ar_a[i].second.first, ar_a[i].second.second);
      s++;
      s1 += ar_a[i].first;
      adj[ar_a[i].second.first].push_back(
          make_pair(ar_a[i].second.second, ar_a[i].first));
      adj[ar_a[i].second.second].push_back(
          make_pair(ar_a[i].second.first, ar_a[i].first));
    }
  }
  dfs(1);
  for (int i = 0; i < 18; i++) par[1][i] = 1;
  cin >> q;
  for (int i = 0; i < q; i++) {
    int t1, t2;
    cin >> t1 >> t2;
    if (s < n - 2)
      cout << -1;
    else if (s == n - 2) {
      if (DSU.findPar(t1) != DSU.findPar(t2))
        cout << s1;
      else
        cout << -1;
    } else {
      cout << s1 - lca(t1, t2);
    }
    cout << endl;
  }
  return 0;
}
