#include <cstdio>
#include <queue>
const int INF=2147483647;
const int max_edge=50000+100;
const int max_node=10000+100;
struct edge{
int to,next;
int dis;
};edge pic[max_edge*2];
int tot,head[max_node];
void add(int from,int to,int dis){
pic[++tot].next=head[from];head[from]=tot;
pic[tot].to=to;
pic[tot].dis=dis;
return;
}
int dis[max_node],vis[max_edge],n,m;
void spfa(int start){
//init();
std::queue<int> q;
for(int i=1;i<=n;i++) dis[i]=INF;
q.push(start);
vis[start]=1;
//spfa();
while(q.size()){
int u=q.front();
q.pop();
vis[u]=0;
for(int i=head[u];i;i=pic[i].next){
int v=pic[i].to;
if(dis[v]>pic[i].dis){
dis[v]=pic[i].dis;
if(!vis[v]){
q.push(v);
vis[v]=1;
}
}
}
}
}
int main(){
// freopen("temp.in","r",stdin);
int q;
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
int x,y,z;
scanf("%d%d%d",&x,&y,&z);
add(x,y,z);
add(y,x,z);
}
scanf("%d",&q);
for(int i=1;i<=q;i++){
int start,end;
scanf("%d%d",&start,&end);
spfa(start);
if(dis[end]==INF) printf("-1\n");
else printf("%d\n",dis[end]);
}
return 0;
}