#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100 * 1000 + 7, MAX_LOG = 18;
vector<pair<int, long long> > adj[MAXN];
int anc[MAXN][MAX_LOG], height[MAXN];
long long maxWeight[MAXN][MAX_LOG];
int compNum[MAXN];
bitset<MAXN> isPassed;
void dfs(int root, int parent, int comp) {
  isPassed[root] = true;
  if (parent != -1) {
    anc[root][0] = parent;
    for (int i = 1; (1 << i) <= height[root]; ++i) {
      anc[root][i] = anc[anc[root][i - 1]][i - 1];
      maxWeight[root][i] =
          max(maxWeight[root][i - 1], maxWeight[anc[root][i - 1]][i - 1]);
    }
  }
  compNum[root] = comp;
  for (int i = 0; i < (int)adj[root].size(); ++i) {
    int neighbour = adj[root][i].first, w = adj[root][i].second;
    if (!isPassed[neighbour]) {
      height[neighbour] = height[root] + 1;
      maxWeight[neighbour][0] = w;
      dfs(neighbour, root, comp);
    }
  }
  return;
}
pair<int, long long> parFinder(int v, int cnt) {
  long long maxW = 0;
  int comp = 1;
  for (int i = 0; comp <= cnt; ++i) {
    if (((cnt >> i) & 1) == 1) {
      maxW = max(maxW, maxWeight[v][i]);
      v = anc[v][i];
    }
    comp = comp << 1;
  }
  return make_pair(v, maxW);
}
int BS(int height, int vertexOne, int vertexTwo) {
  if (vertexOne == vertexTwo) return 0;
  long long maxW = 0;
  for (int i = MAX_LOG; i >= 0; --i) {
    if (((height >> i) and 1) == 1) {
      if (anc[vertexOne][i] != anc[vertexTwo][i]) {
        maxW = max(maxW, maxWeight[vertexOne][i]);
        maxW = max(maxW, maxWeight[vertexTwo][i]);
        vertexOne = anc[vertexOne][i];
        vertexTwo = anc[vertexTwo][i];
        height -= (1 << i);
      }
    }
  }
  maxW = max(maxW, maxWeight[vertexOne][0]);
  maxW = max(maxW, maxWeight[vertexTwo][0]);
  return maxW;
}
int lca(int v, int u) {
  if (height[u] > height[v]) swap(v, u);
  pair<int, long long> temp;
  temp = parFinder(v, height[v] - height[u]);
  long long PAns = BS(height[temp.first], temp.first, u);
  return max(PAns, temp.second);
}
int par[MAXN];
int root(int x) {
  if (par[x] < 0) {
    return x;
  } else {
    par[x] = root(par[x]);
    return par[x];
  }
}
bool insert(int v, int u, long long w) {
  v = root(v);
  u = root(u);
  if (v == u) return false;
  if (par[v] > par[u]) swap(v, u);
  par[v] += par[u];
  par[u] = v;
  adj[v].push_back(make_pair(u, w));
  adj[u].push_back(make_pair(v, w));
  return true;
}
vector<pair<long long, pair<int, int> > > edges;
long long kruskal() {
  memset(par, -1, sizeof par);
  sort(edges.begin(), edges.end());
  long long treeWeight = 0;
  for (int i = 0; i < (int)edges.size(); ++i) {
    long long w = edges[i].first;
    int v = edges[i].second.first, u = edges[i].second.second;
    if (insert(v, u, w)) treeWeight += w;
  }
  return treeWeight;
}
int main() {
  int m, n;
  cin >> n >> m;
  for (int i = 0; i < m; ++i) {
    int temp1, temp2, w;
    cin >> temp1 >> temp2 >> w;
    temp1--;
    temp2--;
    edges.push_back(make_pair(w, make_pair(temp1, temp2)));
  }
  long long treeWeight = kruskal();
  int compCounter = 0;
  for (int i = 0; i < n; ++i) {
    if (!isPassed[i]) {
      compCounter++;
      dfs(i, -1, compCounter);
    }
  }
  int numberOfQueries;
  cin >> numberOfQueries;
  for (int i = 0; i < numberOfQueries; ++i) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    if (compCounter > 2)
      cout << "-1\n";
    else if (compCounter > 1 and compNum[x] == compNum[y])
      cout << "-1\n";
    else if (compCounter > 1 and compNum[x] != compNum[y])
      cout << treeWeight << "\n";
    else
      cout << treeWeight - lca(x, y) << "\n";
  }
  return 0;
}
