#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int, int> ii;
const ll LINF = 1e18;
const int INF = 1e9;
const int N = 2e5 + 5;
struct Edge {
int u, v, w;
};
int n, m;
vector<Edge> edges;
void init() {
edges.clear();
}
struct dsu {
int n;
vector<int> p, sz;
dsu(int n): n(n) {
p.resize(n);
sz.resize(n);
for (int u = 0; u < n; u++) {
p[u] = u;
sz[u] = 1;
}
}
int findSet(int u) {
if (p[u] == u) return u;
return p[u] = findSet(p[u]);
}
bool unionSet(int u, int v) {
u = findSet(u),
v = findSet(v);
if (u == v) return false;
if (sz[u] < sz[v]) swap(u, v);
p[v] = u;
sz[u] += sz[v];
return true;
}
};
void solve() {
cin >> n >> m;
init();
for (int i = 0; i < m; i++) {
int u, v, w;
cin >> u >> v >> w;
edges.push_back({u, v, w});
}
// Ban đầu cho tất cả các bit của đáp án (ans) bật
// Một cách duyệt quen thuộc ở những bài liên quan đến bitmask
// Ta sẽ duyệt từ bit lớn nhất về bit nhỏ nhất
// Khi duyệt đến bit thứ i, ta sẽ kiểm tra xem có tắt được bit thứ i hay không
// Nếu được thì tắt ngay bit thứ i, vì sẽ luôn cho ra phương án tối ưu nhất (nhỏ nhất)
int ans = (1 << 30) - 1;
for (int i = 29; i >= 0; i--) {
ans ^= (1 << i);
dsu DSU(n + 1);
int num_cc = n;
for (Edge e : edges) {
if ((ans & e.w) == e.w) num_cc -= DSU.unionSet(e.u, e.v);
}
if (num_cc > 1) ans |= (1 << i); // không tắt được
}
cout << ans << '\n';
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(nullptr);
int tt;
cin >> tt;
while (tt--) {
solve();
}
}
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOyAKCnR5cGVkZWYgbG9uZyBsb25nIGxsOyAKdHlwZWRlZiBwYWlyPGludCwgaW50PiBpaTsgCgpjb25zdCBsbCBMSU5GID0gMWUxODsgCmNvbnN0IGludCBJTkYgPSAxZTk7Cgpjb25zdCBpbnQgTiA9IDJlNSArIDU7IAoKc3RydWN0IEVkZ2UgewoJaW50IHUsIHYsIHc7ICAKfTsgCgppbnQgbiwgbTsgIAp2ZWN0b3I8RWRnZT4gZWRnZXM7ICAKCnZvaWQgaW5pdCgpIHsKCWVkZ2VzLmNsZWFyKCk7IAp9CgpzdHJ1Y3QgZHN1IHsKCWludCBuOyAKCXZlY3RvcjxpbnQ+IHAsIHN6OyAKCglkc3UoaW50IG4pOiBuKG4pIHsKCQlwLnJlc2l6ZShuKTsgCgkJc3oucmVzaXplKG4pOyAKCQlmb3IgKGludCB1ID0gMDsgdSA8IG47IHUrKykgewoJCQlwW3VdID0gdTsgCgkJCXN6W3VdID0gMTsgCgkJfQoJfQoKCWludCBmaW5kU2V0KGludCB1KSB7CgkJaWYgKHBbdV0gPT0gdSkgcmV0dXJuIHU7IAoJCXJldHVybiBwW3VdID0gZmluZFNldChwW3VdKTsgCgl9CgoJYm9vbCB1bmlvblNldChpbnQgdSwgaW50IHYpIHsKCQl1ID0gZmluZFNldCh1KSwgCgkJdiA9IGZpbmRTZXQodik7IAoJCWlmICh1ID09IHYpIHJldHVybiBmYWxzZTsgCgkJaWYgKHN6W3VdIDwgc3pbdl0pIHN3YXAodSwgdik7IAoJCXBbdl0gPSB1OyAKCQlzelt1XSArPSBzelt2XTsgCgkJcmV0dXJuIHRydWU7IAoJfQkKfTsgCgp2b2lkIHNvbHZlKCkgewoJY2luID4+IG4gPj4gbTsgCgoJaW5pdCgpOyAgIAoKCWZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CgkJaW50IHUsIHYsIHc7IAoJCWNpbiA+PiB1ID4+IHYgPj4gdzsgCgkJZWRnZXMucHVzaF9iYWNrKHt1LCB2LCB3fSk7IAoJfQoKCS8vIEJhbiDEkeG6p3UgY2hvIHThuqV0IGPhuqMgY8OhYyBiaXQgY+G7p2EgxJHDoXAgw6FuIChhbnMpIGLhuq10CgkvLyBN4buZdCBjw6FjaCBkdXnhu4d0IHF1ZW4gdGh14buZYyDhu58gbmjhu69uZyBiw6BpIGxpw6puIHF1YW4gxJHhur9uIGJpdG1hc2sKCS8vIFRhIHPhur0gZHV54buHdCB04burIGJpdCBs4bubbiBuaOG6pXQgduG7gSBiaXQgbmjhu48gbmjhuqV0IAoJLy8gS2hpIGR1eeG7h3QgxJHhur9uIGJpdCB0aOG7qSBpLCB0YSBz4bq9IGtp4buDbSB0cmEgeGVtIGPDsyB04bqvdCDEkcaw4bujYyBiaXQgdGjhu6kgaSBoYXkga2jDtG5nCgkvLyBO4bq/dSDEkcaw4bujYyB0aMOsIHThuq90IG5nYXkgYml0IHRo4bupIGksIHbDrCBz4bq9IGx1w7RuIGNobyByYSBwaMawxqFuZyDDoW4gdOG7kWkgxrB1IG5o4bqldCAobmjhu48gbmjhuqV0KQoJaW50IGFucyA9ICgxIDw8IDMwKSAtIDE7ICAgCglmb3IgKGludCBpID0gMjk7IGkgPj0gMDsgaS0tKSB7CgkJYW5zIF49ICgxIDw8IGkpOyAgCgoJCWRzdSBEU1UobiArIDEpOyAgIAoJCWludCBudW1fY2MgPSBuOyAgIAoJCWZvciAoRWRnZSBlIDogZWRnZXMpIHsKCQkJaWYgKChhbnMgJiBlLncpID09IGUudykgbnVtX2NjIC09IERTVS51bmlvblNldChlLnUsIGUudik7IAoJCX0KCgkJaWYgKG51bV9jYyA+IDEpIGFucyB8PSAoMSA8PCBpKTsgLy8ga2jDtG5nIHThuq90IMSRxrDhu6NjCgl9CgoJY291dCA8PCBhbnMgPDwgJ1xuJzsgCn0KCnNpZ25lZCBtYWluKCkgewoJaW9zOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOyAKCWNpbi50aWUobnVsbHB0cik7IAoJaW50IHR0OyAKCWNpbiA+PiB0dDsgCgl3aGlsZSAodHQtLSkgewoJCXNvbHZlKCk7IAoJfQp9Cg==