```cpp
#include<bits/stdc++.h>
using namespace std;
const int N=10005,M=50005,INF=0x3f3f3f3f;
struct Edge{
int x,y,z;
bool operator < (const Edge &t) const{
return z>t.z;
}
}edge[M];
int n,m,q;
int h[N],e[M<<1],ne[M<<1],w[M<<1],idx;
int fa[N][18],dep[N],res[N][18];
int p[N];
bool vis[N];
int find(int x){
if(x!=p[x]) return p[x]=find(p[x]);
return x;
}
void add(int a,int b,int c){
e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
void dfs(int u,int f,int val){
vis[u]=1;dep[u]=dep[f]+1,fa[u][0]=f,res[u][0]=val;
for(int i=1;i<=18;++i){
fa[u][i]=fa[fa[u][i-1]][i-1];
res[u][i]=min(res[u][i-1],res[fa[u][i-1]][i-1]);
}
for(int i=h[u];~i;i=ne[i]){
int v=e[i];
if(v==f) continue;
dfs(v,u,w[i]);
}
}
int LCA(int x,int y){
if(find(x)!=find(y)) return -1;
int ans=INF;
if(dep[x]<dep[y]) swap(x,y);
for(int i=18;i>=0;i--)
if(dep[fa[x][i]]>=dep[y]){
ans=min(ans,res[x][i]);
x=fa[x][i];
}
if(x==y) return ans;
for(int i=18;i>=0;i--)
if(fa[x][i]!=fa[y][i]){
ans=min(res[y][i],min(ans,res[x][i]));
x=fa[x][i];y=fa[y][i];
}
ans=min(ans,min(res[x][0],res[y][0]));
return ans;
}
int main(){
ios::sync_with_stdio(0);
cin.tie(0),cout.tie(0);
cin>>n>>m;
for(int i=1;i<=m;++i)
cin>>edge[i].x>>edge[i].y>>edge[i].z;
sort(edge+1,edge+1+m);
for(int i=1;i<=n;++i) p[i]=i;
memset(h,-1,sizeof h);
for(int i=1;i<=m;++i){
int px=find(edge[i].x),py=find(edge[i].y);
if(px!=py){
p[px]=py;
add(edge[i].x,edge[i].y,edge[i].z);
add(edge[i].y,edge[i].x,edge[i].z);
}
}
for(int i=1;i<=n;++i){
if(!vis[i])
dfs(i,0,INF);
}
cin>>q;
for(int i=1;i<=q;++i){
int x,y;
cin>>x>>y;
cout<<LCA(x,y)<<"\n";
}
for(int i=1;i<=n;++i){
for(int j=0;j<=5;++j)
cout<<res[i][j]<<" ";
cout<<"\n";
}
return 0;
}