#include #include #include #include #include #include #include #include #include #define FOR(i,a,b) for (int i = (a); i < (b); ++i) #define REP(i,n) FOR(i,0,n) #define TRACE(x) cerr << #x << " = " << x << endl #define _ << " _ " << #define pb push_back #define X first #define Y second using namespace std; typedef long long ll; typedef pair P; const int MAX = 1<<17, TOUR = 1<<17; int poc[MAX], kraj[MAX]; int st[MAX], ind[MAX]; map M_ind; P spaja[MAX]; int w[MAX]; int root[MAX], sz[MAX]; //-1, 1 P kveri[MAX]; int rje[MAX]; int bre=0; int find(int x) { if (root[x] == -1) return x; return find(root[x]); } void odspoji(int a, int b) { if (sz[a] < sz[b]) swap(a, b); sz[a] -= sz[b]; root[b] = -1; } void spoji(int a, int b) { //pazi a = find(a), b = find(b) // a = find(a), b = find(b); if (a == b) return; if (sz[a] < sz[b]) swap(a, b); sz[a] += sz[b]; root[b] = a; } vector V[2*TOUR]; void stavi(int pos, int lo, int hi, int begin, int end, int i) { if (lo >= end || hi <= begin) return; if (lo >= begin && hi <= end) { V[pos].push_back(i); return; } stavi(2*pos+0, lo, (lo+hi)/2, begin, end, i); stavi(2*pos+1, (lo+hi)/2, hi, begin, end, i); } int tez; void dfs(int pos) { vector

Bitan; REP(i, (int) V[pos].size()) { auto it = V[pos][i]; int a = find(spaja[it].X), b = find(spaja[it].Y); if (a != b) { // Bitan[i] = 1; Bitan.push_back(P(a, b)); spoji(a, b); } } if (pos >= TOUR) { int tmp = pos - TOUR; if (st[tmp] == 2) { if (find(kveri[tmp].X) == find(kveri[tmp].Y)) rje[tmp] = min(rje[tmp], tez); } } else { dfs(2*pos); dfs(2*pos+1); } reverse(Bitan.begin(), Bitan.end()); for (auto it : Bitan) odspoji(it.X, it.Y); } void solve(int tezina) { tez = tezina; REP(i, MAX) { root[i] = -1; sz[i] = 1; } REP(i, 2*TOUR) V[i].clear(); REP(i, bre) { // TRACE(i _ poc[i] _ kraj[i] _ w[i] _ spaja[i].X _ spaja[i].Y); if (w[i] > tezina) continue; stavi(1, 0, TOUR, poc[i], kraj[i], i); } dfs(1); } int main(){ ios_base::sync_with_stdio(false); REP(i, MAX) rje[i] = 10000, kraj[i] = -1; int n, q; scanf("%d%d", &n, &q); REP(i, q) { int stanje; scanf("%d", &stanje); st[i] = stanje; if (st[i] == 0) { int x, y, v; scanf("%d%d%d", &x, &y, &v); assert(v >= 0 && v < 10); if (x > y) swap(x, y); M_ind[P(x, y)] = bre; ind[i] = bre; w[bre] = v; poc[bre] = i; spaja[bre++] = P(x, y); } else if (st[i] == 1) { int x, y; scanf("%d%d", &x, &y); if (x > y) swap(x, y); int tmp = M_ind[P(x, y)]; ind[i] = tmp; kraj[tmp] = i; } else { int x, y; scanf("%d%d", &x, &y); if (x > y) swap(x, y); kveri[i] = P(x, y); } } REP(i, MAX) if (kraj[i] == -1) kraj[i] = TOUR-1; REP(i, 10) solve(i); REP(i, q) if (st[i] == 2) printf("%d\n", rje[i] > 15 ? -1 : rje[i]); return 0; }