rt
constexpr int N=3e5+10;
int n,m,cnt;
struct node{
int u,v,dis;
};node G[N];
struct Node{
int to,nxt;
};Node E[N];
int head[N],tot;
int val[N],ff[N],vis[N];
int fa[N],top[N],son[N];
int size[N],dep[N];
bool cmp(node a,node b){
return a.dis<b.dis;
}
void add(int u,int v){
E[++tot].nxt=head[u];
E[tot].to=v;
head[u]=tot;
}
int find(int x){
if(x==ff[x]){
return x;
}
else{
return ff[x]=find(ff[x]);
}
}
void dfs1(int u,int f){
size[u]=1,vis[u]=1;
for(int i=head[u];i;i=E[i].nxt){
int v=E[i].to;
if(v==f){
continue;
}
dep[v]=dep[u]+1;
fa[v]=u;
dfs1(v,u);
size[u]+=size[v];
if(size[v]>size[son[u]]){
son[u]=v;
}
}
}
void dfs2(int u,int t){
top[u]=t;
if(son[u]){
dfs2(son[u],t);
}
for(int i=head[u];i;i=E[i].nxt){
int v=E[i].to;
if(v==fa[u] || v==son[u]){
continue;
}
dfs2(v,v);
}
}
void kruskal(){
sort(G+1,G+1+m,cmp);
rep(i,1,n,1){
ff[i]=i;
}
rep(i,1,m,1){
int fu=find(G[i].u),fv=find(G[i].v);
if(fu!=fv){
val[++cnt]=G[i].dis;
ff[cnt]=ff[fu]=ff[fv]=cnt;
add(fu,cnt);add(cnt,fu);add(fv,cnt);add(cnt,fv);
}
}
rep(i,1,cnt,1){
if(!vis[i]){
int f=find(i);
dfs1(f,0);
dfs2(f,f);
}
}
}
int LCA(int u,int v){
while(top[u]!=top[v]){
if(dep[top[u]]>dep[top[v]]){
u=fa[top[u]];
}
else{
v=fa[top[v]];
}
}
return dep[u]<dep[v]?u:v;
}
void solve(){
n=Read<int>(),m=Read<int>();
cnt=n;
rep(i,1,m,1){
G[i].u=Read<int>(),G[i].v=Read<int>(),G[i].dis=Read<int>();
}
kruskal();
int q=Read<int>();
while(q--){
int u=Read<int>(),v=Read<int>();
if(find(u)!=find(v)){
cout<<"impossible\n";
}
else{
Write(val[LCA(u,v)],'\n');
}
}
}