1 /*uva 11865
2 最小生成树瓶颈路
3 本来写了个BFS预判和LA5713一样,还线性优化了存储,结果还是T了,
4 不得不用LCA了,cry瞎
5 */
6 #include<iostream>
7 #include<string.h>
8 #include<stdio.h>
9 #include<stdlib.h>
10 #include<cmath>
11 #include<algorithm>
12 #include<queue>
13 #include<stack>
14 #include<set>
15 #include<map>
16 #define maxn 100100
17 #define maxm 200100
18 #define inf 999999999
19 using namespace std;
20 int n,m,ques;
21 vector<int>G[maxn];
22 vector<int>D[maxn];
23 int nextint(){int x;scanf("%d",&x);return x;}
24 struct Edge{
25 int u,v,d;
26 bool operator<(const Edge& x ) const{
27 return d<x.d;
28 }
29 }E[maxm],edges[maxm];
30 int p[maxn];
31 int findx(int x){
32 if (x==p[x]) return x;else return p[x]=findx(p[x]);
33 }
34 void init()
35 {
36 for(int i=0;i<m;i++){
37 int u,v,d;
38 u=nextint();v=nextint();d=nextint();
39 u--,v--;
40 E[i]=(Edge){u,v,d};
41 }
42 sort(E,E+m);
43
44 for(int i=0;i<=n;i++) G[i].clear();
45 for(int i=0;i<=n;i++) D[i].clear();
46 }
47 void MST()
48 {
49 for(int i=0;i<=n;i++) p[i]=i;
50
51 for(int i=0;i<m;i++){
52 int u=E[i].u,v=E[i].v,d=E[i].d;
53 int pu=findx(u),pv=findx(v);
54 if (pu==pv) continue;
55 p[pu]=pv;
56 G[u].push_back(v);D[u].push_back(d);
57 G[v].push_back(u);D[v].push_back(d);
58 }
59 }
60
61 int root,fa[maxn],cost[maxn],L[maxn];
62 int anc[maxn][20],maxcost[maxn][20];
63 struct Node{
64 int u,l;
65 };
66 void dfs(int u,int f,int deep)//预处理fa,L,cost
67 {
68 L[u]=deep;
69 for(int i=0;i<G[u].size();i++){
70 int d=D[u][i];
71 int v=G[u][i];
72 if (v!=f){
73 fa[v]=u;
74 cost[v]=d;
75 dfs(v,u,deep+1);
76 }
77 }
78 }
79 void preprocess(){
80 memset(maxcost,0,sizeof(maxcost));
81 memset(anc,0,sizeof(anc));
82 for(int i=0;i<n;i++){
83 anc[i][0]=fa[i];maxcost[i][0]=cost[i];
84 for(int j=1;(1<<j)<n;j++) anc[i][j]=-1;
85 }
86 for(int j=1;(1<<j)<n;j++)
87 for(int i=0;i<n;i++)
88 if (anc[i][j-1]!=-1){
89 int a=anc[i][j-1];
90 anc[i][j]=anc[a][j-1];
91 maxcost[i][j]=max(maxcost[i][j-1],maxcost[a][j-1]);
92 }
93 }
94
95 int query(int p,int q){
96 int tmp,log,i;
97 if(L[p]<L[q]) swap(p,q);
98 for(log = 1;(1<<log)<=L[p];log++);log--;
99
100 int ans=-inf;
101 for(int i=log;i>=0;i--){
102 if (L[p]-(1<<i)>=L[q]){ans=max(ans,maxcost[p][i]);p=anc[p][i];}
103 }
104 if (q==p) return ans;
105
106 for(int i=log;i>=0;i--){
107 if (anc[p][i]!=-1 && anc[p][i]!=anc[q][i]){
108 ans=max(ans,maxcost[p][i]);p=anc[p][i];
109 ans=max(ans,maxcost[q][i]);q=anc[q][i];
110 }
111 }
112 ans=max(ans,cost[p]);
113 ans=max(ans,cost[q]);
114 return ans;
115 }
116 int cas=0;
117 int main()
118 {
119 while(cin>>n>>m && n>0){
120 if (cas>0) printf("\n");
121 init();MST();
122 dfs(0,-1,0);
123 preprocess();
124 int Q;
125 cin>>Q;
126 while(Q--){
127 int p,q;
128 p=nextint();q=nextint();
129 printf("%d\n",query(p-1,q-1));//注意:节点必须从0开始编号
130 }
131 cas++;
132 }
133 return 0;
134 }