#include <iostream>
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <cmath>
using namespace std;
struct sars
{
int u,v,w;
}s[1001];
bool cmp(sars a,sars b)
{
return a.w<b.w;
}
int n,m;
int set[1002];
int findx(int x)
{
int r = x;int i,j;
while (set[r] != r) //循环结束,则找到根节点
r = set[r];
i = x;
while (i != r) //本循环修改查找路径中所有节点
{
j = set[i];
set[i] = r;
i = j;
}
return r;
}
void Union(int x,int y)
{
int fx,fy;
fx = findx(x);
fy = findx(y);
if(fx <= fy)
set[fy] = fx;
else set[fx]=fy;
}
int sol(int st,int en)
{
for(int i=0;i<m;i++){
Union(s[i].u,s[i].v);
}
if(findx(st)!=findx(en))return -1;
int res=1e9;
for(int i=0;i<m;i++)
{
for(int k=0;k<n;k++)
set[k]=k;
for(int j=i;j<m;j++)
{
if(s[j].w-s[i].w>=res)continue;
Union(s[j].u,s[j].v);
if(findx(st)==findx(en))
res=min(res,s[j].w-s[i].w);
}
}
return res;
}
int main(){
while(scanf("%d%d",&n,&m)!=EOF)
{
int a,b,c;
for(int i=0;i<m;i++)
{
cin>>s[i].u>>s[i].v>>s[i].w;
}
sort(s,s+m,cmp);
cin>>a;
while (a--)
{
cin>>b>>c;
printf("%d\n",sol(b,c));
}
}
return 0;
}