#include <bits/stdc++.h>
#pragma comment(linker, "/STACK:836777216")
using namespace std;
int n, m, q, l;
vector<pair<int, pair<int, int> > > edges;
int dsu[100005];
int tin[100005];
int tout[100005];
int t = 0;
int par[100005][20];
int madje[100005][20];
vector<vector<pair<int, int> > > g;
int parent(int v) { return v == dsu[v] ? v : dsu[v] = parent(dsu[v]); }
void connect(int a, int b) {
  a = parent(a);
  b = parent(b);
  dsu[b] = a;
}
void dfs(int v, int p = 0, int w = 0) {
  tin[v] = t++;
  par[v][0] = p;
  madje[v][0] = w;
  for (int(i) = (1); (i) < (l); (i)++) {
    par[v][i] = par[par[v][i - 1]][i - 1];
    madje[v][i] = max(madje[v][i - 1], madje[par[v][i - 1]][i - 1]);
  }
  for (int(i) = 0; (i) < ((int)(g[v]).size()); (i)++) {
    int u = g[v][i].first;
    if (u != p) {
      dfs(u, v, g[v][i].second);
    }
  }
  tout[v] = t++;
}
bool inner(int a, int b) { return tin[a] <= tin[b] && tout[b] <= tout[a]; }
int lca(int a, int b) {
  int ans = 0;
  if (inner(a, b)) {
    for (int(i) = (l - 1) - 1; (i) >= 0; (i)--) {
      if (!inner(par[b][i], a)) {
        ans = max(ans, madje[b][i]);
        b = par[b][i];
      }
    }
    return max(ans, madje[b][0]);
  }
  if (inner(b, a)) {
    for (int(i) = (l - 1) - 1; (i) >= 0; (i)--) {
      if (!inner(par[a][i], b)) {
        ans = max(ans, madje[a][i]);
        a = par[a][i];
      }
    }
    return max(ans, madje[a][0]);
  }
  for (int(i) = (l - 1) - 1; (i) >= 0; (i)--) {
    if (!inner(par[a][i], b)) {
      ans = max(ans, madje[a][i]);
      a = par[a][i];
    }
  }
  ans = max(ans, madje[a][0]);
  for (int(i) = (l - 1) - 1; (i) >= 0; (i)--) {
    if (!inner(par[b][i], par[a][0])) {
      ans = max(ans, madje[b][i]);
      b = par[b][i];
    }
  }
  return max(ans, madje[b][0]);
}
int main(void) {
  memset((par), (0), sizeof((par)));
  memset((madje), (0), sizeof((madje)));
  scanf("%d", &n);
  scanf("%d", &m);
  for (int(i) = 0; (i) < (m); (i)++) {
    int x, y, z;
    scanf("%d%d%d", &x, &y, &z);
    x--, y--;
    edges.push_back(make_pair(z, make_pair(x, y)));
  }
  while ((1 << l) <= n) l++;
  sort((edges).begin(), (edges).end());
  for (int(i) = 0; (i) < (n); (i)++) dsu[i] = i;
  long long sum = 0;
  g.resize(n);
  for (int(i) = 0; (i) < (m); (i)++) {
    if (parent(edges[i].second.first) != parent(edges[i].second.second)) {
      g[edges[i].second.first].push_back(
          make_pair(edges[i].second.second, edges[i].first));
      g[edges[i].second.second].push_back(
          make_pair(edges[i].second.first, edges[i].first));
      connect(edges[i].second.first, edges[i].second.second);
      sum += (long long)edges[i].first;
    }
  }
  int first = -1, second = -1, third = -1;
  for (int(i) = 0; (i) < (n); (i)++) {
    int p = parent(i);
    if (first == -1) {
      first = p;
    } else if (second == -1) {
      if (p != first) {
        second = p;
      }
    } else {
      if (p != first && p != second) {
        third = p;
      }
    }
  }
  dfs(0);
  scanf("%d", &m);
  for (int(i) = 0; (i) < (m); (i)++) {
    int x, y;
    scanf("%d%d", &x, &y);
    x--, y--;
    if (third != -1) {
      printf("-1\n");
    } else {
      if (second != -1) {
        if (parent(x) == parent(y)) {
          printf("-1\n");
        } else
          printf("%lld\n", sum);
      } else {
        printf("%lld\n", sum - lca(x, y));
      }
    }
  }
  return 0;
}
