/*================================================================
*   Copyright (C) 2019 Sangfor Ltd. All rights reserved.
*
*   创 建 者： badcw
*   创建日期： 2019/12/11
*
================================================================*/
#include <bits/stdc++.h>

#define ll long long
using namespace std;

const int maxn = 1e4+50;
const int mod = 1e9+7;
ll qp(ll a, ll n) {
    ll res = 1;
    while (n > 0) {
        if (n & 1) res = res * a % mod;
        a = a * a % mod;
        n >>= 1;
    }
    return res;
}

template <class T>
inline bool scan(T& ret) {
    char c;
    int sgn;
    if (c = getchar(), c == EOF) return 0; // EOF
    while (c != '-' && (c < '0' || c > '9')) c = getchar();
    sgn = (c == '-') ? -1 : 1;
    ret = (c == '-') ? 0 : (c - '0');
    while (c = getchar(), c >= '0' && c <= '9') ret = ret * 10 + (c - '0');
    ret *= sgn;
    return 1;
}

//template <class T>
//inline void out(T x) {
//    if (x > 9) out(x / 10);
//    putchar(x % 10 + '0');
//}

int pre[maxn];
int F(int x) {return x == pre[x] ? x : pre[x] = F(pre[x]);}
int n, m;

int main(int argc, char* argv[]) {
    scanf("%d%d", &n, &m);
    for (int i = 1; i <= n; ++i) pre[i] = i;
    while (m--) {
        int op, u, v;
        scanf("%d%d%d", &op, &u, &v);
        int x = F(u), y = F(v);
        if (op == 0) {
            pre[x] = y;
        } else {
            printf("%d\n", x == y ? 1 : 0);
        }
    }
    return 0;
}

//#include <algorithm>
//#include <cstdio>
//#include <cstring>
//#include <map>
//#include <set>
//
//#define LC o << 1
//#define RC o << 1 | 1
//using namespace std;
//const int maxn = 1000010;
//int n, m, a[maxn];
//int cur1, cur2, q1[maxn], q2[maxn];
//
//struct segment_tree {
//    int cur, rt[maxn * 4], sum[maxn * 60], lc[maxn * 60], rc[maxn * 60];
//
//    void build(int &o) { o = ++cur; }
//
//    void print(int o, int l, int r) {
//        if (!o) return;
//        if (l == r && sum[o]) printf("%d ", l);
//        int mid = (l + r) >> 1;
//        print(lc[o], l, mid);
//        print(rc[o], mid + 1, r);
//    }
//
//    void update(int &o, int l, int r, int x, int v) {
//        if (!o) o = ++cur;
//        sum[o] += v;
//        if (l == r) return;
//        int mid = (l + r) >> 1;
//        if (x <= mid)
//            update(lc[o], l, mid, x, v);
//        else
//            update(rc[o], mid + 1, r, x, v);
//    }
//} st;
//
//inline int lowbit(int o) { return (o & (-o)); }
//
//void upd(int o, int x, int v) {
//    for (; o <= n; o += lowbit(o)) st.update(st.rt[o], 1, n, x, v);
//}
//
//void gtv(int o, int *A, int &p) {
//    p = 0;
//    for (; o; o -= lowbit(o)) A[++p] = st.rt[o];
//}
//
//int qry(int l, int r, int k) {
//    if (l == r) return l;
//    int mid = (l + r) >> 1, siz = 0;
//    for (int i = 1; i <= cur1; i++) siz += st.sum[st.lc[q1[i]]];
//    for (int i = 1; i <= cur2; i++) siz -= st.sum[st.lc[q2[i]]];
//    // printf("j %d %d %d %d\n",cur1,cur2,siz,k);
//    if (siz != k - k / 2) {
//        for (int i = 1; i <= cur1; i++) q1[i] = st.lc[q1[i]];
//        for (int i = 1; i <= cur2; i++) q2[i] = st.lc[q2[i]];
//        return qry(l, mid, k - k / 2);
//    } else {
//        for (int i = 1; i <= cur1; i++) q1[i] = st.rc[q1[i]];
//        for (int i = 1; i <= cur2; i++) q2[i] = st.rc[q2[i]];
//        return qry(mid + 1, r, k / 2);
//    }
//}
//
//int main() {
//    scanf("%d%d", &n, &m);
//    for (int i = 1; i <= n; i++) scanf("%d", &a[i]), upd(i, a[i], 1);
//    int op, le, re;
//    for (int i = 1; i <= m; i++) {
//        scanf("%d%d%d", &op, &le, &re);
//        if (op == 1) {
//            upd(le, a[le], -1);
//            upd(le, re, 1);
//            a[le] = re;
//        } else {
//            gtv(re, q1, cur1);
//            gtv(le - 1, q2, cur2);
//            printf("%d\n", qry(1, n, re - le + 1));
//        }
//    }
//    return 0;
//}


Measured memory_bytes: 3288