#include <iostream>
#include <fstream>
#include <stdint.h>
const int32_t MAX_N = 100000;
int32_t parents[MAX_N], sizes[MAX_N];
int32_t GetRoot(int32_t node) {
while(parents[node] != -1)
node = parents[node];
return node;
}
void Merge(int32_t root1, int32_t root2) {
if(sizes[root1] > sizes[root2]) {
parents[root2] = root1;
} else if(sizes[root2] > sizes[root1]) {
parents[root1] = root2;
} else {
parents[root2] = root1;
++sizes[root1];
}
}
int main() {
std::ifstream fin("disjoint.in");
std::ofstream fout("disjoint.out");
int32_t n, m;
fin >> n >> m;
for(int32_t i = 0; i != n; ++i)
parents[i] = -1;
for(int32_t i = 0; i != m; ++i) {
int32_t c, x, y;
fin >> c >> x >> y;
--x; --y;
int32_t root1 = GetRoot(x), root2 = GetRoot(y);
if(c == 1) {
Merge(root1, root2);
} else {
if(root1 == root2) {
fout << "DA\n";
} else {
fout << "NU\n";
}
}
}
fin.close();
fout.close();
return 0;
}