#include<iostream>
#include<cmath>
#include<algorithm>
#include<cstring>
#include<queue>
#include<stack>
using namespace std;
const int N=100000+5,M=500000+5;
int n,m,q,idx;
int fa[N],p[N],deep[N];
vector<int>v[N];
struct node{
int x,y,z;
}a[M];
struct node1{
int fa,mn;
}f[N][20];
bool cmp(node x,node y)
{
return x.z>y.z;
}
int g(int x)
{
if(fa[x]==x)return x;
else return fa[x]=g(fa[x]);
}
void bfs(int x,int d)
{
deep[x]=d;
for(int i=0;i<v[x].size();i++)
{
bfs(v[x][i],d+1);
}
}
void init()
{
for(int i=1;i<=n;i++)
{
fa[i]=i;
}
sort(a+1,a+1+m,cmp);
for(int i=1;i<=m;i++)
{
int tp1=g(a[i].x),tp2=g(a[i].y);
if(tp1!=tp2)
{
fa[tp1]=tp2;
p[++idx]=i;
}
}
for(int j=0;j<=19;j++)
{
for(int i=1;i<=n;i++)
{
f[i][j].mn=99999999;
}
}
for(int i=1;i<=idx;i++)
{
int tp1=a[p[i]].x,tp2=a[p[i]].y;
if(f[tp1][0].fa!=0)
{
swap(tp1,tp2);
}
f[tp1][0].fa=tp2;
f[tp1][0].mn=a[p[i]].z;
v[tp2].push_back(tp1);
}
for(int i=1;i<=n;i++)
{
if(f[i][0].fa==0)
{
f[i][0].fa=i;
bfs(i,0);
}
}
for(int j=1;j<=19;j++)
{
for(int i=1;i<=n;i++)
{
f[i][j].fa=f[f[i][j-1].fa][j-1].fa;
f[i][j].mn=min(f[i][j-1].mn,f[f[i][j-1].fa][j-1].mn);
}
}
}
int lca(int a,int b)
{
if(g(a)!=g(b))return -1;
if(deep[a]<deep[b])swap(a,b);
int s=deep[a]-deep[b];
int ans=99999999;
for(int i=0;i<=19;i++)
{
if((1<<i)&s)
{
ans=min(ans,f[a][i].mn);
a=f[a][i].fa;
}
}
if(a==b)return ans;
for(int i=19;i>=0;i--)
{
if(f[a][i].fa!=f[b][i].fa)
{
ans=min(ans,min(f[a][i].mn,f[b][i].mn));
a=f[a][i].fa;
b=f[b][i].fa;
}
}
ans=min(ans,min(f[a][0].mn,f[b][0].mn));
return ans;
}
int main()
{
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++)
{
scanf("%d%d%d",&a[i].x,&a[i].y,&a[i].z);
}
init();
scanf("%d",&q);
while(q--)
{
int a,b;
scanf("%d%d",&a,&b);
printf("%d\n",lca(a,b));
}
return 0;
}