#include<bits/stdc++.h>
using namespace std;
struct node{
int x,y,z;
}a[100010];
int n,m,cnt=0,vis[10010],head[10010],deep[10010],dis[10010],fa[10010][22],p,minn[10010][22],f[10010];
int cmp(node u,node v)
{
return u.z>v.z;
}
int find(int a)
{
return f[a]==a? a:f[a]=find(f[a]);
}
struct e{
int to,nxt,w;
}edge[20010];
void add(int a,int b,int w)
{
edge[++cnt].to=b;
edge[cnt].nxt=head[a];
edge[cnt].w=w;
head[a]=cnt;
}
void mbtree()
{
sort(a+1,a+m+1,cmp);
int cntt=0;
for(int i=1;i<=m;i++)
{
int u=a[i].x,v=a[i].y;
int x=find(u),y=find(v);
if(x==y)continue;
f[x]=y;
int w=a[i].z;
add(u,v,w),add(v,u,w);
}
}
queue<int>q;
void dfs(int a)
{
for(int i=head[a];i;i=edge[i].nxt)
{
int to=edge[i].to;
if(deep[to])continue;
deep[to]=deep[a]+1;
fa[to][0]=a;
minn[to][0]=edge[i].w;
dfs(to);
}
}
void init()
{
memset(minn,0x3f,sizeof(minn));
for(int j=1;j<=20;j++)
for(int i=1;i<=n;i++)
{
fa[i][j]=fa[fa[i][j-1]][j-1];
minn[i][j]=min(minn[i][j-1],minn[fa[i][j-1]][j-1]);
}
}
int LCA(int a,int b)
{
int ans=0x3f3f3f3f;
if(deep[a]<deep[b])swap(a,b);
for(int i=20;i>=0;i--)
if(deep[fa[a][i]]>=deep[b])
{
ans=min(ans,minn[a][i]);
a=fa[a][i];
}
if(a==b)return ans;
for(int i=20;i>=0;i--)
if(fa[a][i]!=fa[b][i])
{
ans=min(ans,min(minn[a][i],minn[b][i]));
a=fa[a][i],b=fa[b][i];
}
ans=min(ans,min(minn[a][0],minn[b][0]));
return ans;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
{
int x,y,z;
cin>>x>>y>>z;
a[i]=(node){x,y,z};
}
for(int i=1;i<=n;i++)
f[i]=i;
mbtree();
init();
for(int i=1;i<=n;i++)
if(f[i]==i)
{
deep[i]=1;
dfs(i);
}
cin>>p;
for(int i=1;i<=p;i++)
{
int x,y;
cin>>x>>y;
if(find(x)!=find(y))
{
cout<<-1<<endl;
continue;
}
cout<<LCA(x,y)<<endl;
}
return 0;
}