#include<bits/stdc++.h>
#define MAXN 10001
#define MAXM 50005
#define INF 2147483647
using namespace std;
struct node1{
int head,tail,dis;
}a[MAXM];
struct node2{
int to,next,dis;
}edge[MAXM<<1];
int n,m,q,cnt,head[MAXN],deep[MAXN],parent[MAXN][22],dis[MAXN][22],fa[MAXN];
bool visit[MAXN];
inline void addedge(int from,int to,int dis){
edge[++cnt].next=head[from];
edge[cnt].to=to;
edge[cnt].dis=dis;
head[from]=cnt;
}
inline bool cmp(const node1 &x,const node1 &y){
return x.dis>y.dis;
}
inline int get(int x){
if(fa[x]==x){
return x;
}
return fa[x]=get(fa[x]);
}
inline void kruskal(){
sort(a+1,a+m+1,cmp);
for(int i=1;i<=n;++i){
fa[i]=i;
}
for(int i=1;i<=m;++i){
if(get(a[i].head)!=get(a[i].tail)){
fa[get(a[i].head)]=get(a[i].tail);
addedge(a[i].head,a[i].tail,a[i].dis);
addedge(a[i].tail,a[i].head,a[i].dis);
}
}
}
inline void dfs(int now){
visit[now]=true;
for(int i=head[now];i;i=edge[i].next){
int to=edge[i].to;
if(visit[to]){
continue;
}
deep[to]=deep[now]+1;
parent[to][0]=now;
dis[to][0]=edge[i].dis;
dfs(to);
}
}
inline int lca(int x,int y){
if(get(x)!=get(y)){
return -1;
}
int ans=INF;
if(deep[x]>deep[y]){
swap(x,y);
}
for(int i=20;i>=0;--i){
if(deep[parent[y][i]]){
ans=min(ans,dis[y][i]);
y=parent[y][i];
}
}
if(x==y){
return ans;
}
for(int i=20;i>=0;--i){
if(parent[x][i]!=parent[y][i]){
ans=min(ans,min(dis[x][i],dis[y][i]));
x=parent[x][i];
y=parent[y][i];
}
}
ans=min(ans,min(dis[x][0],dis[y][0]));
return ans;
}
int main(){
scanf("%d %d",&n,&m);
for(int i=1;i<=m;++i){
int x,y,dis;
scanf("%d %d %d",&x,&y,&dis);
a[i].head=x;
a[i].tail=y;
a[i].dis=dis;
}
kruskal();
for(int i=1;i<=n;++i){
if(!visit[i]){
deep[i]=1;
dfs(i);
parent[i][0]=1;
dis[i][0]=INF;
}
}
for(int i=1;i<=20;++i){
for(int j=1;j<=n;++j){
parent[j][i]=parent[parent[j][i-1]][i-1];
dis[j][i]=min(dis[j][i-1],dis[parent[j][i-1]][i-1]);
}
}
scanf("%d",&q);
while(q--){
int x,y;
scanf("%d %d",&x,&y);
printf("%d\n",lca(x,y));
}
return 0;
}