#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
struct data{int x,y,z;}t[N];
int n,m,ft[N];
bool comp(data t1,data t2)
{
return t1.z>t2.z;
}
void part1()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
t[i]=(data){x,y,z};
}
sort(t+1,t+m+1,comp);
for(int i=1;i<=n;i++)
ft[i]=i;
}
struct edge{int id,val;};
vector<edge>p[N];
int find(int x)
{
ft[x]==x?x:ft[x]=find(ft[x]);
}
void part2()
{
for(int i=1;i<=m;i++)
{
int px,py,pz;
int fx,fy;
px=t[i].x;
py=t[i].y;
pz=t[i].z;
fx=find(px);
fy=find(py);
if(fx!=fy)
{
ft[fx]=fy;
p[px].push_back((edge){py,pz});
p[py].push_back((edge){px,pz});
}
}
}
int f[N][20],depth[N],g[N][20];
void dfs(int x)
{
for(int i=1;i<=15;i++)
{
f[x][i]=f[f[x][i-1]][i-1];
g[x][i]=min(g[f[x][i-1]][i-1],g[x][i-1]);
}
int len=p[x].size();
for(int i=0;i<len;i++)
{
int px=p[x][i].id;
int val=p[x][i].val;
if(depth[px])
continue;
depth[px]=depth[x]+1;
f[px][0]=x;
g[px][0]=val;
dfs(px);
}
}
void part3()
{
for(int i=1;i<=n;i++)
if(depth[i]==0)
{
depth[i]=1;
dfs(i);
}
}
int lca(int x,int y)
{
if(depth[x]<depth[y])
swap(x,y);
int ans=2e9;
for(int i=15;~i;i--)
if(depth[y]<=depth[f[x][i]])
{
ans=min(ans,g[x][i]);
x=f[x][i];
}
if(x==y)
return ans;
for(int i=15;~i;i--)
if(f[x][i]!=f[y][i])
{
ans=min(ans,g[x][i]);
ans=min(ans,g[y][i]);
x=f[x][i],y=f[y][i];
}
ans=min(ans,g[x][0]);
ans=min(ans,g[y][0]);
return ans;
}
int T;
void get_ans()
{
scanf("%d",&T);
while(T--)
{
int x,y;
scanf("%d%d",&x,&y);
if(find(x)!=find(y))
printf("-1\n");
else
printf("%d\n",lca(x,y));
}
}
int main()
{
part1();
part2();
part3();
get_ans();
return 0;
}