#include <bits/stdc++.h>
using namespace std;
int n=0,m=0;
vector<int> gra[300038];
vector<int> w[300038];
vector<int> tre[300038];
vector<int> tw[300038];
int lca[300038][17];
int lw[300038][17];
int root[300038]={0};
int dep[300038];
struct nod{
int number;
int distance;
int father;
};
bool operator < (nod a,nod b){return a.distance==b.distance ? a.number<b.number : a.distance>b.distance;}
map<int,nod> ma;
set<nod> se;
nod x;
char c;
map<int,nod>::iterator xx;
int inf=1e9;
int main(){
c=getchar();
while(c>47&&c<58){n=(n<<1)+(n<<3)+(c^48);c=getchar();}
c=getchar();
while(c>47&&c<58){m=(m<<1)+(m<<3)+(c^48);c=getchar();}
for(int i=1;i<=m;i++){
int x=0,y=0,z=0;
c=getchar();
while(c>47&&c<58){x=(x<<1)+(x<<3)+(c^48);c=getchar();}
c=getchar();
while(c>47&&c<58){y=(y<<1)+(y<<3)+(c^48);c=getchar();}
c=getchar();
while(c>47&&c<58){z=(z<<1)+(z<<3)+(c^48);c=getchar();}
gra[x].push_back(y);
gra[y].push_back(x);
w[x].push_back(-z);
w[y].push_back(-z);
}
for(int kkk=1;kkk<=n;kkk++){
if(root[kkk]==0){
x.number=kkk;
x.distance=0;
x.father=0;
ma.insert(make_pair(kkk,x));
se.insert(x);
dep[kkk]=1;
root[kkk]=kkk;
while(!se.empty()){
nod pcur=*se.begin();
int pc=pcur.number;
root[pc]=kkk;
se.erase(se.begin());
ma.erase(ma.find(pc));
if(pcur.father!=0){
int fa=pcur.father;
lca[pc][0]=fa;
lw[pc][0]=pcur.distance;
tre[fa].push_back(pc);
tw[fa].push_back(pcur.distance);
dep[pc]=dep[fa]+1;
}
else{
lca[pc][0]=pc;
lw[pc][0]=inf;
}
for(int i=0;i<gra[pc].size();i++){
int ch=gra[pc][i];
if(root[ch]==0){
xx=ma.find(ch);
if(xx!=ma.end()){
x=xx->second;
if(x.distance<w[pc][i]){
se.erase(se.find(x));
ma.erase(ma.find(x.number));
x.distance=w[pc][i];
x.father=pc;
ma.insert(make_pair(x.number,x));
se.insert(x);
}
}
else{
x.number=ch;
x.distance=w[pc][i];
x.father=pc;
ma.insert(make_pair(ch,x));
se.insert(x);
}
}
}
}
}
}
for(int j=1;j<=16;j++){
for(int i=1;i<=n;i++){
lca[i][j]=lca[lca[i][j-1]][j-1];
lw[i][j]=min(lw[i][j-1],lw[lca[i][j-1]][j-1]);
}
}
int q=0;
c=getchar();
while(c>47&&c<58){q=(q<<1)+(q<<3)+(c^48);c=getchar();}
for(int kkk=1;kkk<=q;kkk++){
int s=0,t=0;
c=getchar();
while(c>47&&c<58){s=(s<<1)+(s<<3)+(c^48);c=getchar();}
c=getchar();
while(c>47&&c<58){t=(t<<1)+(t<<3)+(c^48);c=getchar();}
if(root[s]!=root[t]){
printf("impossible\n");
continue;
}
else{
int a=s,b=t;
int pans=inf;
if(dep[a]<dep[b]){swap(a,b);}
if(dep[a]>dep[b]){
for(int i=16;i>=0;i--){
if(dep[lca[a][i]]>dep[b]){
pans=min(pans,lw[a][i]);
a=lca[a][i];
}
}
pans=min(pans,lw[a][0]);
a=lca[a][0];
}
if(a!=b){
for(int i=16;i>=0;i--){
if(lca[a][i]!=lca[b][i]){
pans=min(pans,lw[a][i]);
pans=min(pans,lw[b][i]);
a=lca[a][i];
b=lca[b][i];
}
}
pans=min(pans,lw[a][0]);
pans=min(pans,lw[b][0]);
}
printf("%d\n",-pans);
}
}
return 0;
}
数组大小在1e6,2e6,3e6,1e7时均RE