#include<bits/stdc++.h>
using namespace std;
int n,m,h[500001],idx=1,f[100001],Q;
struct rey
{
int u,v,w;
}E[500001];
struct node
{
int ne,tv,w;
}e[500001];
struct fin
{
int ip,minw;
};
queue<fin> q;
bool cmp(rey E1,rey E2)
{
return E1.w>E2.w;
}
int find(int x)
{
if(f[x]==x)return x;
else return f[x]=find(f[x]);
}
void add(int U,int V,int W)
{
e[idx].tv=V;
e[idx].ne=h[U];
e[idx].w=W;
h[U]=idx++;
}
void kruskal()
{
for(int i=1;i<=m;i++)
{
int x=find(E[i].u),y=find(E[i].v);
if(x!=y)
{
f[x]=y;
add(E[i].u,E[i].v,E[i].w);
}
}
}
int bfs(int now,int goal)
{
for(int i=h[now];i!=-1;i=e[i].ne)
{
q.push({e[i].tv,e[i].w});
}
while(q.size())
{
fin tmp=q.front();
q.pop();
if(tmp.ip==goal)return tmp.minw;
else
{
for(int i=h[tmp.ip];i!=-1;i=e[i].ne)
{
q.push({e[i].tv,min(e[i].w,tmp.minw)});
}
}
}
}
int main()
{
memset(h,-1,sizeof h);
cin>>n>>m;
for(int i=1;i<=n;i++)f[i]=i;
for(int i=1;i<=m;i++)
{
cin>>E[i].u>>E[i].v>>E[i].w;
}
sort(E+1,E+m+1,cmp);
kruskal();
cin>>Q;
for(int i=1;i<=Q;i++)
{
int S,F;
cin>>S>>F;
if(find(S)!=find(F))
{
cout<<-1<<endl;
continue;
}
else cout<<bfs(S,F)<<endl;
}
return 0;
}