#include <bits/stdc++.h>
using namespace std;
const int MAX = 1e5 + 10, lg = 22;
vector<pair<int, pair<int, int> > > edge;
vector<pair<int, int> > g[MAX];
int h[MAX], f[MAX], par[MAX][lg], ans[MAX][lg];
int root(int v) { return f[v] < 0 ? v : f[v] = root(f[v]); }
bool merge(int a, int b) {
  if ((a = root(a)) == (b = root(b))) return false;
  if (f[b] < f[a]) swap(a, b);
  return f[a] += f[b], f[b] = a, true;
}
void dfs(int v, int p = -1) {
  for (auto uu : g[v])
    if (uu.first != p) {
      int u = uu.first;
      par[u][0] = v, ans[u][0] = uu.second;
      h[u] = h[v] + 1;
      for (int i = 1; i < lg; i++)
        par[u][i] = par[par[u][i - 1]][i - 1],
        ans[u][i] = max(ans[u][i - 1], ans[par[u][i - 1]][i - 1]);
      dfs(u, v);
    }
}
int parent(int v, int h) {
  for (int i = 0; i < lg; i++)
    if (h & (1 << i)) v = par[v][i];
  return v;
}
int res(int v, int h) {
  int ret = 0;
  for (int i = 0; i < lg; i++)
    if (h & (1 << i)) ret = max(ret, ans[v][i]), v = par[v][i];
  return ret;
}
int lca(int v, int u) {
  if (h[v] < h[u]) swap(v, u);
  v = parent(v, h[v] - h[u]);
  if (v == u) return v;
  for (int i = lg - 1; i >= 0; i--)
    if (par[v][i] != par[u][i]) v = par[v][i], u = par[u][i];
  return par[v][0];
}
int main() {
  ios_base::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  memset(f, -1, sizeof f);
  int n, m, a, b, c;
  cin >> n >> m;
  for (int i = 0; i < m; i++)
    cin >> a >> b >> c, a--, b--, edge.push_back({c, {a, b}});
  sort(edge.begin(), edge.end());
  long long mst = 0;
  for (int i = 0; i < m; i++) {
    a = edge[i].second.first, b = edge[i].second.second, c = edge[i].first;
    if (merge(a, b)) g[a].push_back({b, c}), g[b].push_back({a, c}), mst += c;
  }
  int comp = 0;
  for (int i = 0; i < n; i++)
    if (f[i] < 0) comp++;
  dfs(0);
  int q;
  cin >> q;
  while (q--) {
    int a, b;
    cin >> a >> b, a--, b--;
    if (comp > 2)
      cout << -1 << '\n';
    else if (comp == 2) {
      if (root(a) == root(b))
        cout << -1 << '\n';
      else
        cout << mst << '\n';
    } else {
      int v = lca(a, b);
      cout << mst - max(res(a, h[a] - h[v]), res(b, h[b] - h[v])) << '\n';
    }
  }
}
