#include<bits/stdc++.h>
using namespace std;
#define int long long
int dis[300010][20],ver[1000010],nex[1000010],head[100010],tot;
int f[100010][20],dep[100010],fa[100010],edge[100010],vis[1000010];
int n,m,q;
struct node
{
int x,y,z;
}a[3000010];
void init()
{
for(int j=1;j<=20;j++)
for(int i=1;i<=n;i++)
{
f[i][j]=f[f[i][j-1]][j-1];
dis[i][j]=max(dis[i][j-1],dis[f[i][j-1]][j-1]);
}
return ;
}
void add(int x,int y,int z)
{
ver[++tot]=y,nex[tot]=head[x],edge[tot]=z,head[x]=tot;
}
bool cmp(node a,node b)
{
return a.z<b.z;
}
int get(int x)
{
if(x==fa[x])return x;
return fa[x]=get(fa[x]);
}
int lca(int x,int y)
{
if(get(x)!=get(y))return -1;
int ans=0;
if(dep[x]<dep[y])swap(x,y);
for(int i=20;i>=0;i--)if(f[x][i]&&dep[f[x][i]]>=dep[y])ans=max(ans,dis[x][i]),x=f[x][i];
if(x==y)return ans;
for(int i=20;i>=0;i--)if(f[x][i]&&f[y][i]&&f[x][i]!=f[y][i])ans=max(ans,max(dis[x][i],dis[y][i])),x=f[x][i],y=f[y][i];
ans=max(ans,max(dis[x][0],dis[y][0]));
return ans;
}
void MST()
{
int cnt=0;
sort(a+1,a+m+1,cmp);
for(int i=1;i<=m;i++)
{
int xx=get(a[i].x),yy=get(a[i].y);
if(xx==yy)continue;
add(a[i].x,a[i].y,a[i].z);
add(a[i].y,a[i].x,a[i].z);
fa[xx]=yy;
cnt++;
if(cnt==n-1)break;
}
}
void dfs(int x)
{
vis[x]=1;
for(int i=head[x];i;i=nex[i])
{
int y=ver[i];
if(vis[y])continue;
dep[y]=dep[x]+1;
f[y][0]=x;
dis[y][0]=edge[i];
dfs(y);
}
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)fa[i]=i;
for(int i=1;i<=m;i++)
scanf("%lld%lld%lld",&a[i].x,&a[i].y,&a[i].z);
MST();
dfs(1);
init();
scanf("%lld",&q);
while(q--)
{
int x,y;
scanf("%lld%lld",&x,&y);
int l=lca(x,y);
if(l==-1)puts("impossible");
else printf("%lld\n",l);
}
return 0;
}