rtqwq
#include<bits/stdc++.h>
using namespace std;
const int maxn=1e6+5;
struct node
{
int v,nxt;
}e[maxn<<1];
int head[maxn],tot;
void add(int x,int y)
{
e[++tot].v=y;
e[tot].nxt=head[x];
head[x]=tot;
}
struct edge
{
int x,y,w;
}a[maxn<<1];
int n,m,q;
int cmp(edge s1,edge s2)
{
return s1.w<s2.w;
}
int fa[maxn],siz[maxn],son[maxn],dfn[maxn],de[maxn],top[maxn];
int idx,fat[maxn];
void dfs1(int x,int fa)
{
fat[x]=fa;
de[x]=de[fa]+1;
siz[x]=1;
son[x]=0;
for(int i=head[x];i;i=e[i].nxt)
{
int v=e[i].v;
if(v==fa)
continue;
dfs1(v,x);
siz[x]+=siz[v];
if(siz[v]>=siz[son[x]])
son[x]=v;
}
}
void dfs2(int x,int tp)
{
top[x]=tp;
dfn[x]=++idx;
if(son[x]==0)
return;
dfs2(son[x],tp);
for(int i=head[x];i;i=e[i].nxt)
{
int v=e[i].v;
if(dfn[v])
continue;
dfs2(v,v);
}
}
int lca(int x,int y)
{
while(top[x]!=top[y])
{
if(de[y]>de[x])
y=fat[top[y]];
else
x=fat[top[x]];
}
return de[x]<de[y]?x:y;
}
int b[maxn];
int getfa(int x)
{
return fa[x]==x?fa[x]:fa[x]=getfa(fa[x]);
}
int main()
{
cin>>n>>m;
for(int i=1;i<=m;i++)
cin>>a[i].x>>a[i].y>>a[i].w;
int cnt=n;
sort(a+1,a+m+1,cmp);
for(int i=1;i<=n;i++)
fa[i]=i;
for(int i=1;i<=m;i++)
{
int fx=getfa(a[i].x),fy=getfa(a[i].y);
if(fx!=fy)
{
fa[fx]=fa[fy]=++cnt;
fa[cnt]=cnt;
b[cnt]=a[i].w;
add(cnt,fx);
add(fx,cnt);
add(cnt,fy);
add(fy,cnt);
}
}
n=cnt;
for(int i=n;i>=1;i--)
if(!de[i])
{
dfs1(i,i);
dfs2(i,i);
}
cin>>q;
for(int i=1;i<=q;i++)
{
int x,y;
cin>>x>>y;
if(getfa(x)!=getfa(y))
cout<<"impossible\n";
else
cout<<b[lca(x,y)]<<'\n';
}
return 0;
}