#include <bits/stdc++.h>
using namespace std;
const int MAXN = 100010;
const int MAXM = 200010;
struct Tedge {
  int p, v, next;
};
int n, m, c;
long long sum;
pair<int, pair<int, int> > sedge[MAXM];
int a[MAXN];
int f[MAXN];
int d[MAXN];
Tedge edge[MAXM];
bool chk[MAXN];
int lca[MAXN][20];
int lcm[MAXN][20];
int q[MAXN];
int s[MAXN];
int getf(int p) {
  int top = 1;
  s[top] = p;
  while (f[s[top]] != s[top]) {
    s[top + 1] = f[s[top]];
    ++top;
  }
  p = s[top];
  while (top--) {
    f[s[top]] = p;
  }
  return p;
}
int max(int a, int b) { return a > b ? a : b; }
void init() {
  scanf("%d", &n);
  scanf("%d", &m);
  for (int i = 1; i <= m; ++i)
    scanf("%d %d %d", &sedge[i].second.first, &sedge[i].second.second,
          &sedge[i].first);
}
void MST() {
  int i, l = 0;
  c = n;
  memset(a, 0xff, sizeof(a));
  sort(sedge + 1, sedge + m + 1);
  for (i = 1; i <= n; ++i) f[i] = i;
  sum = 0;
  for (i = 1; i <= m; ++i)
    if (getf(sedge[i].second.first) != getf(sedge[i].second.second)) {
      edge[++l].p = sedge[i].second.second;
      edge[l].v = sedge[i].first;
      edge[l].next = a[sedge[i].second.first];
      a[sedge[i].second.first] = l;
      edge[++l].p = sedge[i].second.first;
      edge[l].v = sedge[i].first;
      edge[l].next = a[sedge[i].second.second];
      a[sedge[i].second.second] = l;
      f[getf(sedge[i].second.first)] = getf(sedge[i].second.second);
      --c;
      sum += sedge[i].first;
    } else {
    }
}
void bfs(int p) {
  chk[p] = true;
  int st, ed;
  st = 0;
  ed = 1;
  q[1] = p;
  int i, k;
  while (st < ed) {
    k = q[++st];
    i = 0;
    while (lca[k][i] != -1) {
      lca[k][i + 1] = lca[lca[k][i]][i];
      lcm[k][i + 1] = max(lcm[k][i], lcm[lca[k][i]][i]);
      ++i;
    }
    for (i = a[k]; i != -1; i = edge[i].next)
      if (!chk[edge[i].p]) {
        chk[edge[i].p] = true;
        d[edge[i].p] = d[k] + 1;
        lca[edge[i].p][0] = k;
        lcm[edge[i].p][0] = edge[i].v;
        q[++ed] = edge[i].p;
      }
  }
}
int get(int u, int v) {
  int ret = 0;
  int tmp;
  int i;
  if (d[u] < d[v]) {
    tmp = u;
    u = v;
    v = tmp;
  }
  i = 19;
  while (d[u] > d[v]) {
    while (d[u] > d[v] && lca[u][i] > 0 && d[lca[u][i]] >= d[v]) {
      ret = max(ret, lcm[u][i]);
      u = lca[u][i];
    }
    --i;
  }
  if (u == v) return ret;
  i = 19;
  while (lca[u][0] != lca[v][0]) {
    while (lca[u][0] != lca[v][0] && lca[u][i] > 0 && lca[v][i] > 0 &&
           lca[u][i] != lca[v][i]) {
      ret = max(ret, max(lcm[u][i], lcm[v][i]));
      u = lca[u][i];
      v = lca[v][i];
    }
    --i;
  }
  return max(ret, max(lcm[u][0], lcm[v][0]));
}
void solve() {
  MST();
  if (c > 2) {
    scanf("%d", &m);
    while (m--) printf("-1\n");
  } else if (c == 2) {
    int u, v;
    scanf("%d", &m);
    while (m--) {
      scanf("%d %d", &u, &v);
      if (getf(u) != getf(v))
        printf("%I64d\n", sum);
      else
        printf("-1\n");
    }
  } else {
    memset(lca, 0xff, sizeof(lca));
    memset(lcm, 0xff, sizeof(lcm));
    bfs(1);
    memset(chk, 0, sizeof(chk));
    int u, v;
    scanf("%d", &m);
    while (m--) {
      scanf("%d %d", &u, &v);
      printf("%I64d\n", sum - get(u, v));
    }
  }
}
int main() {
  init();
  solve();
  return 0;
}
