#include <bits/stdc++.h>
using namespace std;
#define ll long long
#define mem(a, b) memset(a,b,sizeof(a))
#define INF 0x3f3f3f3f
#define DBG printf("this is a input\n")
#define fi first
#define se second
#define mk(a, b) make_pair(a,b)
#define p_queue priority_queue
ll gcd(ll a, ll b) {
return b == 0 ? a : gcd(b, a % b);
}
ll lcm(ll a, ll b) {
return a / gcd(a, b) * b;
}
int n , m;
int head[50005], fa[50005], dfn[50005], cnt;
int bz[50005][25] , dp[50005][25];
struct node{
int f, t ,next, w;
bool operator < (const node& no)const {
return w > no.w;
}
}input[500005],edge[500005];
void add(int f, int t , int w)
{
edge[cnt].t = t;
edge[cnt].w = w;
edge[cnt].next = head[f];
head[f] = cnt ++;
}
void dfs(int root , int deep)
{
dfn[root] = deep;
for(int i = head[root] ; i != -1 ; i = edge[i].next)
{
int v = edge[i].t, w = edge[i].w;
if(!dfn[v])
{
bz[v][0] = root;
dp[v][0] = w;
dfs(v,deep+1);
}
}
}
void deal()
{
for(int i = 1 ; i <= 20 ; i ++)
{
for(int j = 1 ; j <= n ; j ++)
{
bz[j][i] = bz[bz[j][i-1]][i-1];
dp[j][i] = min(dp[j][i-1],dp[bz[j][i-1]][i-1]);
}
}
}
int LCA(int x, int y)
{
int ans = INF;
if(dfn[x] < dfn[y])
swap(x,y);
for(int i = 20 ; i >= 0 ; i --)
{
if(dfn[bz[x][i]] >= dfn[y]) //if((dfn[x]-dfn[y])>>i)更保险
{
ans = min(ans,dp[x][i]);
x = bz[x][i];
}
}
if(x == y) return ans;
for(int i = 20 ; i >= 0 ; i --)
{
if(bz[x][i] ^ bz[y][i])
{
ans = min(ans,dp[x][i]);
ans = min(ans,dp[y][i]);
x = bz[x][i];
y = bz[y][i];
}
}
ans = min(ans,dp[x][0]);
ans = min(ans,dp[y][0]);
return ans;
}
int findroot(int x)
{
if(fa[x] == x)
return x;
return fa[x] = findroot(fa[x]);
}
bool merge(int x , int y)
{
int fax = findroot(x);
int fay = findroot(y);
if(fax != fay) {
fa[fax] = fay;
return true;
}
return false;
}
int main(void)
{
cin>>n>>m;
mem(head,-1);
for(int i = 1 ; i <= n ; i ++)
fa[i] = i;
for(int i = 1 ; i <= m ; i ++)
cin>>input[i].f>>input[i].t>>input[i].w;
sort(input+1,input+1+m);
for(int i = 1 ; i <= m ; i ++)
{
if(merge(input[i].f,input[i].t))
{
add(input[i].f,input[i].t,input[i].w);
add(input[i].t,input[i].f,input[i].w);
}
}
for(int i = 1 ; i <= n ; i ++)
{
if(!dfn[i])
dfs(i,1);
}
deal();
int t;
cin>>t;
for(int i = 1 ; i <= t ; i ++)
{
int u , v;
cin>>u>>v;
int fax = findroot(u);
int fay = findroot(v);
if(fax == fay)
{
int xx = LCA(u,v);
cout << xx << endl;
}
else
cout<<-1<<endl;
}
}