#include using namespace std; struct UnionFind { vector par, rank, size; int c; UnionFind(int n) : par(n), rank(n, 0), size(n, 1), c(n) { for(int i = 0; i < n; ++i) par[i] = i; } int find(int i) { return (par[i] == i ? i : (par[i] = find(par[i]))); } bool same(int i, int j) { return find(i) == find(j); } int get_size(int i) { return size[find(i)]; } int count() { return c; } void merge(int i, int j) { if((i = find(i)) == (j = find(j))) return; c--; if(rank[i] > rank[j]) swap(i, j); par[i] = j; size[j] += size[i]; if(rank[i] == rank[j]) rank[j]++; } }; struct S { int l, r, v; }; struct T { int a, b; }; int main() { int n, a, b; cin >> n >> a >> b; vector g(n); for(auto &x : g) cin >> x.l >> x.r >> x.v; UnionFind uf(n); queue q; q.push({a, b, 0}); while(!q.empty()) { int a = q.front().l, b = q.front().r, d = q.front().v; q.pop(); if(uf.same(a, b)) continue; if(g[a].v != g[b].v) { cout << d << endl; return 0; } uf.merge(a, b); for(T t : {T{g[a].l, g[b].l}, T{g[a].r, g[b].r}}) { int a = t.a, b = t.b; q.push({a, b, d + 1}); } } cout << "INDISTINGUISHABLE" << endl; return 0; }