#include <bits/stdc++.h>
std::ifstream in("disjoint.in");
std::ofstream out("disjoint.out");
class DSUROLLBACK {
private:
class Event {
public:
int u, dadU, v, rankV;
Event(int _u, int _dadU, int _v, int _rankV) {
u = _u;
v = _v;
dadU = _dadU;
rankV = _rankV;
}
Event() {}
};
int n;
std::stack<Event> events;
std::vector<int> r, dad;
public:
DSUROLLBACK(int _n) {
n = _n;
r.resize(n + 1, 1);
dad.resize(n + 1);
std::iota(dad.begin(), dad.end(), 0);
}
int find(int u) {
if (u == dad[u]) {
return u;
}
return find(dad[u]);
}
void join(int u, int v) {
int a = find(u), b = find(v);
if (a == b) {
return;
}
if (r[a] < r[b]) {
std::swap(a, b);
}
events.push(Event(b, dad[b], a, r[a]));
dad[b] = a;
r[a] += r[b];
}
bool rollback() {
if (!(int)events.size()) {
return false;
}
Event last = events.top();
events.pop();
int u = last.u, v = last.v, dadU = last.dadU, rankV = last.rankV;
dad[u] = dadU;
r[v] = rankV;
return true;
}
};
int n, m;
int main() {
in >> n >> m;
DSUROLLBACK ds(n);
for (int i = 1; i <= m; i++) {
int op, x, y;
in >> op >> x >> y;
if (op == 1) {
ds.join(x, y);
} else {
x = ds.find(x);
y = ds.find(y);
out << ((x == y) ? "DA\n" : "NU\n");
}
}
return 0;
}