#include "bits/stdc++.h"
using namespace std;
class UnionFind {
private:
long long Nodes;
vector<long long> Parent, Rank, Size;
public:
UnionFind(long long N) : Nodes(N) {
Parent.resize(N);
Rank.assign(N, 0);
Size.assign(N, 1);
for (int i = 0; i < N; i++) {
Parent[i] = i;
}
}
void reset(long long N) {
if (Nodes == N) {
for (int i = 0; i < N; i++) {
Parent[i] = i;
Rank[i] = 0;
Size[i] = 1;
}
}
else {
Nodes = N;
Parent.resize(N);
Rank.assign(N, 0);
Size.assign(N, 1);
for (int i = 0; i < N; i++) {
Parent[i] = i;
}
}
return;
}
long long Root(long long N) {
return N == Parent[N] ? N : Parent[N] = Root(Parent[N]);
}
bool Same(long long A, long long B) {
return Root(A) == Root(B);
}
long long SizeF(long long A) {
return Size[Root(A)];
}
void Merge(long long A, long long B) {
long long RA = Root(A), RB = Root(B);
if (RA == RB) return;
if (Rank[RA] < Rank[RB]) {
Size[RB] += Size[RA];
Parent[RA] = RB;
}
else {
Size[RA] += Size[RB];
Parent[RB] = RA;
if (Rank[RA] == Rank[RB]) Rank[RA]++;
}
}
};
struct Query {
long long X, Y, Z, L, R, N;
};
int main() {
long long N, M, Q;
vector<pair<long long, long long> > E;
vector<Query> VQ;
cin >> N >> M;
E.resize(M);
UnionFind UF(N);
for (int i = 0; i < M; i++) {
cin >> E[i].first >> E[i].second;
E[i].first--, E[i].second--;
}
cin >> Q;
VQ.resize(Q);
for (int i = 0; i < Q; i++) {
cin >> VQ[i].X >> VQ[i].Y >> VQ[i].Z;
VQ[i].X--, VQ[i].Y--;
VQ[i].L = -1, VQ[i].R = M, VQ[i].N = i;
}
while (1) {
bool check = true;
sort(VQ.begin(), VQ.end(), [](Query Q1, Query Q2) {return (Q1.L + Q1.R) < (Q2.L + Q2.R); });
UF.reset(N);
long long NOW = 0;
for (int i = 0; i < M; i++) {
while (NOW < Q && (VQ[NOW].L + VQ[NOW].R + 1) / 2 == i) {
if (VQ[NOW].R - VQ[NOW].L <= 1) {
NOW++;
if (NOW == Q) break;
continue;
}
long long S = 0;
if (UF.Same(VQ[NOW].X, VQ[NOW].Y)) S = UF.SizeF(VQ[NOW].X);
else S = UF.SizeF(VQ[NOW].X) + UF.SizeF(VQ[NOW].Y);
if (S >= VQ[NOW].Z) VQ[NOW].R = i;
else VQ[NOW].L = i;
check = false;
NOW++;
if (NOW == Q) break;
}
if (NOW == Q) break;
UF.Merge(E[i].first, E[i].second);
}
if (check) break;
}
sort(VQ.begin(), VQ.end(), [](Query Q1, Query Q2) {return Q1.N < Q2.N; });
for (int i = 0; i < Q; i++) {
cout << VQ[i].R << endl;
}
}