Rt
#include"iostream"
#include"cstdio"
#include"cmath"
#include"algorithm"
#include"cstring"
using namespace std;
#define read(x) scanf("%d",&x)
#define MAXN 50005
#define inf 2147483647
int n,m,q;
struct node
{
int x,y,z;
}ed[MAXN];
struct edge
{
int to,nxt,w;
}e[MAXN<<1];
int head[MAXN],cnt=0,c=0;
int f[MAXN],fat[MAXN];
int tot[MAXN],son[MAXN];
int t[MAXN],vis[MAXN];
int cntt=0,topf[MAXN],id[MAXN];
int dis[MAXN],dep[MAXN];
struct Tree
{
int maxn,l,r;
}a[MAXN<<2];
int x,y;
inline void update(int k){a[k].maxn=min(a[k<<1].maxn,a[k<<1|1].maxn);}
void build(int k,int l,int r)
{
a[k].l=l,a[k].r=r;
if(l==r){a[k].maxn=t[l];return;}
int mid=(l+r)>>1;
build(k<<1,l,mid),build(k<<1|1,mid+1,r);
update(k);
return;
}
int query(int k,int l,int r)
{
if(l>r) return inf;
if(a[k].l==l&&a[k].r==r) return a[k].maxn;
int mid=(a[k].l+a[k].r)>>1;
if(r<=mid) return query(k<<1,l,r);
else if(l>mid) return query(k<<1|1,l,r);
else return min(query(k<<1,l,mid),query(k<<1|1,mid+1,r));
}
void add(int u,int v,int w)
{
e[++cnt].to=v;
e[cnt].w=w;
e[cnt].nxt=head[u];
head[u]=cnt;
}
void init(int n){for(int i=1;i<=n;i++) f[i]=i;}
int getf(int u){return f[u]=(f[u]==u)?u:getf(f[u]);}
bool merge(int u,int v){int t1=getf(u),t2=getf(v);if(t1!=t2){f[t2]=t1;return true;}else return false;}
bool cmp(node n,node m){return n.z>m.z;}
int dfs1(int cur,int fa,int deep)
{
vis[cur]=1;
fat[cur]=cur;
tot[cur]=1;
dep[cur]=deep;
int maxson=0;
for(int i=head[cur];i;i=e[i].nxt)
{
int j=e[i].to;
if(j==fa) continue;
tot[cur]+=dfs1(j,cur,deep+1);
if(maxson<tot[j]) maxson=tot[j],son[cur]=j,dis[cur]=e[i].w;
}
return tot[cur];
}
void dfs2(int cur,int fa,int top,int lng)
{
vis[cur]=1;
topf[cur]=top;
if(fa!=cur) cntt++,id[cur]=cntt,t[cntt]=lng;
else cntt++,id[cur]=cntt,t[cntt]=inf;
if(!son[cur]) return;
dfs2(son[cur],cur,top,dis[cur]);
for(int i=head[cur];i;i=e[i].nxt)
{
int j=e[i].to;
if(!vis[j]) dfs2(j,cur,j,e[i].w);
}
return;
}
int work(int x,int y)
{
if(getf(x)!=getf(y)) return -1;
int ans=inf;
while(topf[x]!=topf[y])
{
if(dep[topf[x]]<=dep[topf[y]]) swap(x,y);
ans=min(ans,query(1,id[topf[x]],id[x]));
x=fat[topf[x]];
}
if(dep[x]>dep[y]) swap(x,y);
if(x==y) return ans;
else return ans=min(ans,query(1,id[son[x]],id[y]));
}
int main()
{
read(n),read(m);
for(int i=1;i<=m;i++) read(ed[i].x),read(ed[i].y),read(ed[i].z);
sort(ed+1,ed+1+m,cmp),init(n);
for(int i=1;i<=m;i++)
{
if(merge(ed[i].x,ed[i].y))
{
c++;
add(ed[i].x,ed[i].y,ed[i].z),add(ed[i].y,ed[i].x,ed[i].z);
if(c==n-1) break;
}
}
for(int i=1;i<=n;i++) if(!vis[i]) fat[i]=i,dfs1(i,0,1);
memset(vis,0,sizeof(vis));
for(int i=1;i<=n;i++) if(!vis[i]) dfs2(i,i,i,0);
build(1,1,cntt);
read(q);
while(q--)
{
read(x),read(y);
printf("%d\n",work(x,y));
}
return 0;
}