#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll inf=100000000;
const int maxn=5*1e4+10;
ll n,m,qq[maxn],head[2*maxn],cnt,v[2*maxn],w[2*maxn],nxt[2*maxn],
f[maxn][30],minn[maxn][30],dep[maxn],fa[maxn],t;
ll lca(int x,int y){
ll ans=inf;
if(dep[x]<dep[y]) swap(x,y);
for(int i=22;i>=0;i--){
if(dep[f[x][i]]>=dep[y]){
ans=min(ans,minn[x][i]);x=f[x][i];
}
}
if(x==y) return ans;
for(int i=22;i>=0;i--){
if(f[x][i]!=f[y][i]){
ans=min(ans,min(minn[x][i],minn[y][i]));
x=f[x][i],y=f[y][i];
}
}
return min(min(minn[x][0],minn[y][0]),ans);
}
void init(){
for(int j=1;j<=22;j++){
for(int i=1;i<=n;i++){
f[i][j]=f[f[i][j-1]][j-1];
minn[i][j]=min(minn[i][j-1],minn[f[i][j-1]][j-1]);
}
}
/*for(int j=1;(1<<j)<=n;j++){
for(int i=1;i<=n;i++)
cout<<minn[i][j]<<' ';
cout<<endl;
}*/
}
inline ll read(){
ll num=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') num=num*10+ch-'0',ch=getchar();
return num*f;
}
void add(int x,int y,int z){
++cnt; v[cnt]=y; w[cnt]=z; nxt[cnt]=head[x]; head[x]=cnt;
}
int find(int x){
return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
}
struct node{
ll x,y,z;
}s[maxn];
bool cmp(node a,node b){
return a.z>b.z;
}
void dfs(int x,int y){
for(int i=head[x];i;i=nxt[i]){
if(v[i]!=y){
dep[v[i]]=dep[x]+1;
f[v[i]][0]=x;
minn[v[i]][0]=w[i];
dfs(v[i],x);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
s[i].x=read(); s[i].y=read(); s[i].z=read();
//add(s[i].x,s[i].y,s[i].z); add(s[i].y,s[i].x,s[i].z);
}
sort(s+1,s+1+m,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int fx=find(s[i].x);
int fy=find(s[i].y);
if(fx!=fy){
fa[fx]=fy; qq[++t]=i;
if(t==n-1) break;
}
}
//for(int i=1;i<=t;i++) cout<<qq[i]<<endl;
for(int i=1;i<=t;i++){
add(s[qq[i]].x,s[qq[i]].y,s[qq[i]].z);
add(s[qq[i]].y,s[qq[i]].x,s[qq[i]].z);
}
dep[1]=1;
dfs(1,0);
//cout<<"minn "<<endl;
//for(int i=1;i<=n;i++) cout<<minn[i][0]<<' ';
//cout<<endl;
/*for(int i=1;i<=n;i++) cout<<f[i][0]<<' ';
cout<<endl; */
init();
int q; scanf("%d",&q);
while(q--){
int xx,yy;
xx=read(),yy=read();
if(find(xx)!=find(yy)) printf("-1\n");
else printf("%lld\n",lca(xx,yy));
}
return 0;
}
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const ll inf=100000000;
const int maxn=5*1e4+10;
ll n,m,qq[maxn],head[2*maxn],cnt,v[2*maxn],w[2*maxn],nxt[2*maxn],
f[maxn][30],minn[maxn][30],dep[maxn],fa[maxn],t;
ll lca(int x,int y){
ll ans=inf;
if(dep[x]<dep[y]) swap(x,y);
for(int i=22;i>=0;i--){
if(dep[f[x][i]]>=dep[y]){
ans=min(ans,minn[x][i]);x=f[x][i];
}
}
if(x==y) return ans;
for(int i=22;i>=0;i--){
if(f[x][i]!=f[y][i]){
ans=min(ans,min(minn[x][i],minn[y][i]));
x=f[x][i],y=f[y][i];
}
}
return min(min(minn[x][0],minn[y][0]),ans);
}
void init(){
for(int j=1;j<=22;j++){
for(int i=1;i<=n;i++){
f[i][j]=f[f[i][j-1]][j-1];
minn[i][j]=min(minn[i][j-1],minn[f[i][j-1]][j-1]);
}
}
/*for(int j=1;(1<<j)<=n;j++){
for(int i=1;i<=n;i++)
cout<<minn[i][j]<<' ';
cout<<endl;
}*/
}
inline ll read(){
ll num=0,f=1; char ch=getchar();
while(ch<'0'||ch>'9'){
if(ch=='-') f=-1;
ch=getchar();
}
while(ch>='0'&&ch<='9') num=num*10+ch-'0',ch=getchar();
return num*f;
}
void add(int x,int y,int z){
++cnt; v[cnt]=y; w[cnt]=z; nxt[cnt]=head[x]; head[x]=cnt;
}
int find(int x){
return fa[x]==x?fa[x]:fa[x]=find(fa[x]);
}
struct node{
ll x,y,z;
}s[maxn];
bool cmp(node a,node b){
return a.z>b.z;
}
void dfs(int x,int y){
for(int i=head[x];i;i=nxt[i]){
if(v[i]!=y){
dep[v[i]]=dep[x]+1;
f[v[i]][0]=x;
minn[v[i]][0]=w[i];
dfs(v[i],x);
}
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=m;i++){
s[i].x=read(); s[i].y=read(); s[i].z=read();
//add(s[i].x,s[i].y,s[i].z); add(s[i].y,s[i].x,s[i].z);
}
sort(s+1,s+1+m,cmp);
for(int i=1;i<=n;i++) fa[i]=i;
for(int i=1;i<=m;i++){
int fx=find(s[i].x);
int fy=find(s[i].y);
if(fx!=fy){
fa[fx]=fy; qq[++t]=i;
if(t==n-1) break;
}
}
//for(int i=1;i<=t;i++) cout<<qq[i]<<endl;
for(int i=1;i<=t;i++){
add(s[qq[i]].x,s[qq[i]].y,s[qq[i]].z);
add(s[qq[i]].y,s[qq[i]].x,s[qq[i]].z);
}
dep[1]=1;
dfs(1,0);
//cout<<"minn "<<endl;
//for(int i=1;i<=n;i++) cout<<minn[i][0]<<' ';
//cout<<endl;
/*for(int i=1;i<=n;i++) cout<<f[i][0]<<' ';
cout<<endl; */
init();
int q; scanf("%d",&q);
while(q--){
int xx,yy;
xx=read(),yy=read();
if(find(xx)!=find(yy)) printf("-1\n");
else printf("%lld\n",lca(xx,yy));
}
return 0;
}