#include <bits/stdc++.h>
using namespace std ;
struct node
{
int a , b , c ;
};
int n , m , q , fa[20004] , sn , h[20004] , deep[20004] , pa[20004][20] , lg[20004] ;
node w[50004] ;
vector <int> v[20004] ;
bool cmp( node a , node b )
{
return a.c > b.c ;
}
int find( int x )
{
while( fa[x] != x )
{
x = fa[x] = fa[fa[x]] ;
}
return x ;
}
void dfs(int now, int fa)
{
pa[now][0] = fa;
deep[now] = deep[fa] + 1;
for( int i = 1; i <= lg[deep[now]]; ++i )
{
pa[now][i] = pa[pa[now][i-1]][i-1];
}
for(int i = 0 ; i < v[now].size() ; i ++ )
{
if(v[now][i] != fa) dfs(v[now][i],now);
}
}
int LCA(int x, int y)
{
if(deep[x] < deep[y]) swap(x, y) ;
while(deep[x] > deep[y])x = pa[x][lg[deep[x]-deep[y]] - 1];
if(x == y) return x;
for(int k = 19; k >= 0; --k )
{
if(pa[x][k] != pa[y][k])
{
x = pa[x][k], y = pa[y][k];
}
}
return pa[x][0];
}
int main()
{
cin >> n >> m ;
sn = n ;
for(int i = 1; i <= n; ++i) lg[i] = lg[i-1] + (1 << lg[i-1] == i);
for( int i = 1 ; i <= 2 * n ; i ++ )
{
fa[i] = i ;
}
for( int i = 1 ; i <= m ; i ++ )
{
cin >> w[i].a >> w[i].b >> w[i].c ;
}
sort( w + 1 , w + n + 1 , cmp ) ;
for( int i = 1 ; i <= m ; i ++ )
{
if( sn - n == n - 1 ) break ;
if( find(w[i].a) == find(w[i].b) ) continue ;
sn ++ ;
v[sn].push_back(find(w[i].a));
v[sn].push_back(find(w[i].b));
fa[find(w[i].a)] = sn ;
fa[find(w[i].b)] = sn ;
h[sn] = w[i].c ;
}
for( int i = sn ; i >= 1 ; i -- )
{
if(!deep[i])dfs( i , 0 ) ;
}
cin >> q ;
for( int i = 1 ; i <= q ; i ++ )
{
int a , b ;
cin >> a >> b ;
if( find(a) != find(b) ) cout << -1 << endl ;
else cout << h[LCA( a , b )] << endl ;
}
return 0 ;
}