Problem: We have a tree with N vertices numbered 1 to N. The i-th edge in the tree connects Vertex u_i and Vertex v_i, and its length is w_i. Your objective is to paint each vertex in the tree white or black (it is fine to paint all vertices the same color) so that the following condition is satisfied:

* For any two vertices painted in the same color, the distance between them is an even number.



Find a coloring of the vertices that satisfies the condition and print it. It can be proved that at least one such coloring exists under the constraints of this problem.

Constraints

* All values in input are integers.
* 1 \leq N \leq 10^5
* 1 \leq u_i < v_i \leq N
* 1 \leq w_i \leq 10^9

Input

Input is given from Standard Input in the following format:


N
u_1 v_1 w_1
u_2 v_2 w_2
.
.
.
u_{N - 1} v_{N - 1} w_{N - 1}


Output

Print a coloring of the vertices that satisfies the condition, in N lines. The i-th line should contain `0` if Vertex i is painted white and `1` if it is painted black.

If there are multiple colorings that satisfy the condition, any of them will be accepted.

Examples

Input

3
1 2 2
2 3 1


Output

0
0
1


Input

5
2 5 2
2 3 10
1 3 8
3 4 2


Output

1
0
1
0
1

Solution (in JAVA):

Solution:
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.util.*;

public class Main {
    public static void main(String[] args) {
        InputStream inputStream = System.in;
        OutputStream outputStream = System.out;
        InputReader in = new InputReader(inputStream);
        PrintWriter out = new PrintWriter(outputStream);
        Task solver = new Task();
        solver.solve(in, out);
        out.close();
    }

    static class Task {
        int N;
        int[] color; // white: 0, black: 1, not painted: -1
        List<Set<int[]>> graph = new ArrayList<>();

        void bfs() {
            Queue<Integer> q = new ArrayDeque<>();

            color[1] = 0;
            q.offer(1);

            while (q.size() > 0) {
                int node = q.poll();
                for (int[] nextNodeInfo : graph.get(node)) {
                    int v = nextNodeInfo[0];
                    int w = nextNodeInfo[1];

                    if (color[v] == -1) {
                        q.offer(v);
                        if (w % 2 == 0) {
                            color[v] = color[node];
                        } else {
                            color[v] = 1 - color[node];
                        }
                    }
                }
            }
        }

        void solve(InputReader in, PrintWriter out) {
            // write your code here
            N = in.nextInt();

            color = new int[N];
            Arrays.fill(color, -1);

            for (int i = 0; i < N; i++) {
                graph.add(new HashSet<>());
            }

            for (int i = 0; i < N - 1; i++) {
                int u = in.nextInt(); --u;
                int v = in.nextInt(); --v;
                int w = in.nextInt() % 2;

                graph.get(u).add(new int[] {v, w});
                graph.get(v).add(new int[] {u, w});
            }

            bfs();

            for (int i = 0; i < N; i++) {
                out.println(color[i]);
            }
        }
    }

    static class InputReader {
        BufferedReader reader;
        StringTokenizer tokenizer;

        InputReader(InputStream stream) {
            reader = new BufferedReader(new InputStreamReader(stream));
            tokenizer = null;
        }

        String next() {
            while (tokenizer == null || !tokenizer.hasMoreTokens()) {
                try {
                    tokenizer = new StringTokenizer(reader.readLine());
                } catch (IOException e) {
                    throw new RuntimeException(e);
                }
            }
            return tokenizer.nextToken();
        }

        int nextInt() {
            return Integer.parseInt(next());
        }

        int[] nextIntArray(int size) {
            int[] arr = new int[size];
            for (int i = 0; i < size; i++) {
                arr[i] = nextInt();
            }
            return arr;
        }
    }
}