Problem: Write a program which manipulates a disjoint set S = {S1, S2, . . . , Sk}.

First of all, the program should read an integer n, then make a disjoint set where each element consists of 0, 1, ... n−1 respectively.

Next, the program should read an integer q and manipulate the set for q queries. There are two kinds of queries for different operations:

* unite(x, y): unites sets that contain x and y, say Sx and Sy, into a new set.
* same(x, y): determine whether x and y are in the same set.

Constraints

* 1 ≤ n ≤ 10000
* 1 ≤ q ≤ 100000
* x ≠ y

Input


n q
com1 x1 y1
com2 x2 y2
...
comq xq yq


In the first line, n and q are given. Then, q queries are given where com represents the type of queries. '0' denotes unite and '1' denotes same operation.

Output

For each same operation, print 1 if x and y are in the same set, otherwise 0, in a line.

Example

Input

5 12
0 1 4
0 2 3
1 1 2
1 3 4
1 1 4
1 3 2
0 1 3
1 2 4
1 3 0
0 0 4
1 0 2
1 3 0


Output

0
0
1
1
1
0
1
1

Solution (in JAVA):

Solution:
import java.util.*;
import java.lang.*;

public class Main {
    static final int INF = 1000000000;             
    static final int MAXN = 111111; 
    static int[] parentOf;
    public static void main(String[] args) throws Exception {                
        Scanner input = new Scanner(System.in);
        int n, q;
        n = input.nextInt();
        q = input.nextInt();
        parentOf = new int[n];
        for (int i = 0; i < n; ++i) parentOf[i] = -1;
        for (int i = 0; i < q; ++i) {
            int op = input.nextInt();
            int u, v;
            u = input.nextInt();
            v = input.nextInt();
            if (op == 0) {
                union(u, v);
            } else {
                if (rootOf(u) == rootOf(v)) System.out.println("1");
                else System.out.println("0");
            }
        }
    }                  
    
    static void union(int u, int v) {
        u = rootOf(u);
        v = rootOf(v);
        if (u == v) return;
        if (parentOf[u] < parentOf[v]) {
            parentOf[u] = v;
            --parentOf[v];
        } else {
            parentOf[v] = u;
            --parentOf[u];
        }
    }
    
    static int rootOf(int x) {
        if (parentOf[x] < 0) return x;
        parentOf[x] = rootOf(parentOf[x]);
        return parentOf[x];
    }
}