#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10;
const int inf=1e5+10;
vector <pair<int,int> > e[N];
int n,m,q;
int f[N];
int fa[20][N],dis[N];
int w[20][N];
bool vis[N];
struct node{
int u,v,t;
}ad[N];
bool cmp(node x,node y){
return x.t>y.t;
}
void init(){
for(int i=1;i<=n;i++){
f[i]=i;
}
}
int find(int x){
if(x==f[x])return x;
return f[x]=find(f[x]);
}
void merge(int a,int b){
int u=find(a),v=find(b);
if(u==v)return;
f[u]=v;
}
void dfs(int x,int father,int d){
vis[x]=1;
fa[0][x]=father;
dis[x]=d;
for(int i=0;i<e[x].size();i++){
if(!vis[e[x][i].first]){
w[0][e[x][i].first]=e[x][i].second;
dfs(e[x][i].first,x,d+1);
}
}
return;
}
void lca_init(){
for(int k=1;k<=20;k++){
for(int i=1;i<=n;i++){
fa[k][i]=fa[k-1][fa[k-1][i]];
w[k][i]=min(w[k-1][fa[k-1][i]],w[k-1][i]);
}
}
}
int query(int a,int b){
if(find(a)!=find(b))return -1;
int ans=inf;
if(a!=b){
if(dis[a]<dis[b])swap(a,b);
int k=dis[a]-dis[b];
for(int i=20;i>=0;i--){
if(dis[fa[i][a]]>=dis[a]){
a=fa[i][a];
ans=min(ans,w[i][a]);
}
}
}
if(a==b)return ans;
for(int i=20;i>=0;i--){
if(fa[i][a]!=fa[i][b]){
ans=min(ans,min(w[i][a],w[i][b]));
a=fa[i][a];
b=fa[i][b];
}
}
ans=min(ans,min(w[0][a],w[0][b]));
return ans;
}
int main(){
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
init();
for(int i=1;i<=m;i++){
cin>>ad[i].u>>ad[i].v>>ad[i].t;
}
sort(ad+1,ad+1+m,cmp);
for(int i=1;i<=m;i++){
int x=ad[i].u,y=ad[i].v,z=ad[i].t;
if(find(x)!=find(y)){
merge(x,y);
e[x].push_back(make_pair(y,z));
e[y].push_back(make_pair(x,z));
}
}
for(int i=1;i<=n;i++){
if(!vis[i]){
dfs(i,i,1);
w[0][i]=inf;
}
}
lca_init();
cin>>q;
while(q--){
int x,y;
cin>>x>>y;
cout<<query(x,y)<<"\n";
}
return 0;
}