#3 #4 #5 #6 #11 #12 mle
#include<bits/stdc++.h>
using namespace std;
int n,m;
int pv[300010];
int parent[300010];
int find(int x){
if(parent[x]==x)
return x;
return parent[x]=find(parent[x]);
}
struct edgee{
int from,to,w;
}edge[300010];
struct node{
int v,to,next;
}e[300010];
int head[300010],cnt=0;
void add(int a,int b,int v){
e[cnt].to=b;
e[cnt].v=v;
e[cnt].next=head[a];
head[a]=cnt++;
}
int deep[300010],ancestor[300010][16];
void dfs(int x,int fa){// cout<<x<<endl;
deep[x]=deep[fa]+1;
ancestor[x][0]=fa;
for(int i=1;(1<<i)<=deep[x];i++)
ancestor[x][i]=ancestor[ancestor[x][i-1]][i-1];
for(int i=head[x];i!=-1;i=e[i].next)
if(e[i].to!=fa)
dfs(e[i].to,x);
}
int lca(int a,int b){
if(deep[a]<deep[b]){
int t=a; a=b; b=t;
}
for(int i=15;i>=0;i--)
if(deep[a]-(1<<i)>=deep[b])
a=ancestor[a][i];
if(a==b)
return a;
for(int i=15;i>=0;i--){
if(ancestor[a][i]!=ancestor[b][i]){
a=ancestor[a][i]; b=ancestor[b][i];
}
}
return ancestor[a][0];
}
bool cmp(edgee a,edgee b){
return a.w<b.w;
}
signed main(){
cin>>n>>m;
for(int i=0;i<=(1<<n);i++)
parent[i]=i,head[i]=-1;
for(int i=1;i<=m;i++){
int a,b,v; cin>>edge[i].from>>edge[i].to>>edge[i].w;
}
sort(edge+1,edge+1+m,cmp);
// for(int i=1;i<=m;i++)
// cout<<": "<<edge[i].from<<" "<<edge[i].to<<endl;
for(int i=1;i<=m;i++){
int a=find(edge[i].from),b=find(edge[i].to);
if(a==b)
continue;
parent[a]=parent[b]=++n;
// cout<<"* "<<n<<": "<<a<<" "<<b<<" "<<edge[i].w<<endl;
add(n,a,1); add(a,n,1); add(b,n,1); add(n,b,1);
pv[n]=edge[i].w;
}
for(int i=n;i>=1;i--){
if(deep[i]==0)
deep[i]=1,dfs(i,0);
}
// for(int i=1;i<=n;i++)
// cout<<i<<" fa:"<<ancestor[i][0]<<endl;
int q; cin>>q;
while(q--){
int a,b; cin>>a>>b;
if(find(a)!=find(b))
cout<<"impossible"<<endl;
else
cout<<pv[lca(a,b)]<<endl;
}
return 0;
}