program truck;
type edgee=^edge;
     edge=record
      adj,w:longint;
      next:edgee;
     end;
var dp,mm:array[1..10000,0..15]of longint;
    a:array[1..10000]of edgee;
    v:array[1..10000]of boolean;
    f,d:array[1..10000]of longint;
    e:array[1..50000,1..3]of longint;
    n,i,j,k,m,l,q,ans,x,y:longint;
    c:edgee;
function min(a,b:longint):longint;
 begin
 if a<b then exit(a)
 else exit(b);
 end;
procedure sort(h,l:longint);
var i,j,m:longint; k:array[1..3]of longint;
 begin
 i:=h; j:=l; m:=e[(i+j)div 2,3];
 while i<j do
  begin
  while e[i,3]<m do inc(i);
  while e[j,3]>m do dec(j);
  if i<=j
  then
   begin
   k:=e[i]; e[i]:=e[j]; e[j]:=k;
   inc(i); dec(j);
   end;
  end;
 if i<l then sort(i,l);
 if j>h then sort(h,j);
 end;
function find(x:longint):longint;
 begin
 if f[x]=x
 then exit(x);
 f[x]:=find(f[x]);
 exit(f[x]);
 end;
procedure dfs(x,i:longint);
var j:edgee; k:longint;
 begin
 v[x]:=true; d[x]:=i;
 j:=a[x];
 while j<>nil do
  begin
  if not v[j^.adj]
  then
   begin
   dp[j^.adj,0]:=x; mm[j^.adj,0]:=j^.w; k:=0;
   while dp[dp[j^.adj,k],k]<>0 do
    begin
    dp[j^.adj,k+1]:=dp[dp[j^.adj,k],k];
    mm[j^.adj,k+1]:=min(mm[j^.adj,k],mm[dp[j^.adj,k],k]);
    inc(k);
    end;
   dfs(j^.adj,i+1);
   end;
  j:=j^.next;
  end;
 end;
begin
 readln(n,m);
 for i:=1 to m do
  read(e[i,1],e[i,2],e[i,3]);
 for i:=1 to n do
  f[i]:=i;
 sort(1,m);
 k:=0;
 for i:=m downto 1 do
  if find(e[i,1])<>find(e[i,2])
  then
   begin
   f[find(e[i,2])]:=find(e[i,1]);
   new(c); c^.adj:=e[i,2]; c^.w:=e[i,3]; c^.next:=a[e[i,1]]; a[e[i,1]]:=c;
   new(c); c^.adj:=e[i,1]; c^.w:=e[i,3]; c^.next:=a[e[i,2]]; a[e[i,2]]:=c;
   inc(k); if k=n-1 then break;
   end;
 for i:=1 to n do
  if not v[i]
  then
   dfs(i,0);
 readln(q);
 for i:=1 to q do
  begin
  readln(x,y);
  if find(x)<>find(y)
  then begin writeln(-1); continue; end;
  if d[x]<d[y]
  then
   begin
   l:=x; x:=y; y:=l;
   end;
  ans:=maxlongint; l:=d[x]-d[y]; k:=0;
  while l<>0 do
   begin
   if l and 1=1
   then
    begin
    ans:=min(ans,mm[x,k]);
    x:=dp[x,k];
    end;
   l:=l shr 1;
   inc(k);
   end;
  k:=0;
  while x<>y do
   begin
   if (dp[x,k]<>dp[y,k])or(k=0)
   then
    begin
    ans:=min(ans,min(mm[x,k],mm[y,k]));
    x:=dp[x,k]; y:=dp[y,k];
    inc(k);
    end
   else dec(k);
   end;
  writeln(ans);
  end;
end.

/**************************************************************
	Problem: 2326
	User: admin
	Language: Pascal
	Result: Wrong Answer
****************************************************************/