#include<bits/stdc++.h>
//#define kedge sb
#define int long long
using namespace std;
int n,m;
struct node{
int u,v,w,next;
}edge[1000005],kedge[1000005];
int num,head[1000005],khead[1000005],knum;
int a[1000005];
void add(int u,int v,int w){
edge[++num].next=head[u];
head[u]=num;
edge[num].v=v;
edge[num].w=w;
edge[num].u=u;
}
void kadd(int u,int v,int w){
kedge[++knum].next=khead[u];
khead[u]=knum;
kedge[knum].v=v;
kedge[knum].w=w;
kedge[knum].u=u;
}
int fa[1000005],dep[1000005],son[1000005],siz[1000005];
int id[1000005],tmp[1000005],top[1000005],cnt;
void dfs1(int now,int fath,int deep){
fa[now]=fath;
dep[now]=deep;
siz[now]=1;
int maxsiz=-1;
for(int i=khead[now];i;i=kedge[i].next){
int v=kedge[i].v;
if(v==fath)continue;
dfs1(v,now,deep+1);
siz[now]+=siz[v];
a[v]=kedge[i].w;
if(maxsiz<siz[v]){
maxsiz=siz[v];
son[now]=v;
}
}
}
void dfs2(int now,int topf){
id[now]=++cnt;
tmp[cnt]=a[now];
top[now]=topf;
if(!son[now])return;
dfs2(son[now],topf);
for(int i=khead[now];i;i=kedge[i].next){
int v=kedge[i].v;
if(v==son[now]||v==fa[now])continue;
dfs2(v,v);
}
}
bool cmp(node a,node b){
return a.w<b.w;
}
int father[1000005];
int find(int x){
if(father[x]!=x)father[x]=find(father[x]);
return father[x];
}
struct tree{
int val,tag;
}tree[1000005<<2];
inline int ls(int p){
return p<<1;
}
inline int rs(int p){
return p<<1|1;
}
inline void pushup(int p){
tree[p].val=max(tree[ls(p)].val,tree[rs(p)].val);
}
inline void build(int p,int l,int r){
if(l==r){
tree[p].val=tmp[l];
return;
}
int mid=l+r>>1;
build(ls(p),l,mid);
build(rs(p),mid+1,r);
pushup(p);
}
inline int query (int p,int l,int r,int ql,int qr){
if(l>qr||r<ql)return INT_MIN;
// cout<<l<<" "<<r<<" "<<tree[p].val<<endl;
if(l>=ql&&r<=qr){
return tree[p].val;
}
int mid=l+r>>1;
return max(query(ls(p),l,mid,ql,qr),query(rs(p),mid+1,r,ql,qr));
}
inline int qrange(int x,int y){
int ans=0;
while(top[x]!=top[y]){
if(dep[top[x]]<dep[top[y]])swap(x,y);
ans=max(ans,query(1,1,n,id[top[x]],id[x]));
// cout<<id[top[x]]<<" "<<id[x]<<endl;
x=fa[top[x]];
}
if(dep[x]>dep[y])swap(x,y);
// cout<<id[x]<<" "<<id[y]<<" "<<query(1,1,n,5,5)<<endl;
return max(ans,query(1,1,n,id[x],id[y]));
}
signed main(){
cin>>n>>m;
for(int i=1;i<=m;i++){
int u,v,w;
cin>>u>>v>>w;
add(u,v,w);
add(v,u,w);
}
sort(edge+1,edge+num+1,cmp);
for(int i=1;i<=n;i++){
father[i]=i;
}
int ccnt=0;
for(int i=1;i<=num;i++){
int fu=find(edge[i].u),fv=find(edge[i].v);
if(fu==fv)continue;
father[fu]=fv;
kadd(edge[i].u,edge[i].v,edge[i].w);
kadd(edge[i].v,edge[i].u,edge[i].w);
ccnt++;
if(ccnt==n-1)break;
}
dfs1(1,0,1);
dfs2(1,1);
build(1,1,n);
// for(int i=1;i<=n;i++){
// cout<<tmp[i]<<" ";
// }
// cout<<endl;
int q;
cin>>q;
while(q--){
int u,v;
cin>>u>>v;
if(find(u)!=find(v)){
cout<<"impossible\n";
}
else{
cout<<qrange(u,v)<<endl;
}
}
return 0;
}