using System;
using System.Numerics;
using System.Linq;
using System.Collections.Generic;
using System.Text;
using System.Collections;

namespace debug
{
    class main
    {
        static void Main(string[] args)
        {
            //問題クラスを展開
            ProgramD a = new ProgramD();
            a.main();//実行する

        }

    }

    class ProgramA
    {
        public void main()
        {
            string[] n = Console.ReadLine().Split(' ');
            string s = Console.ReadLine();

            //
            int num = int.Parse(n[1]) - 1;
            for (int i = 0; i < int.Parse(n[0]); i++)
            {
                int temp = s[i];
                if (i == num)
                {
                    temp += 32;
                    Console.Write((char)temp);
                }
                else
                {
                    Console.Write((char)temp);
                }
            }

        }
    }

    class ProgramB
    {
        public void main()
        {
            //入力
            string s = Console.ReadLine();

            //
            int flag1 = 0;
            int flag2 = 0;

            int y = (s[0] - '0') * 10 + (s[1] - '0');
            int m = (s[2] - '0') * 10 + (s[3] - '0');

            if (0 < y && y < 13)
                flag1 = 1;
            if (0 < m && m < 13)
                flag2 = 1;

            if (flag1 == 1 && flag2 == 1)
            {
                Console.WriteLine("AMBIGUOUS");
                return;
            }

            if (flag1 == 1 && flag2 == 0)
            {
                Console.WriteLine("MMYY");
                return;
            }

            if (flag1 == 0 && flag2 == 1)
            {
                Console.WriteLine("YYMM");
                return;
            }

            Console.WriteLine("NA");
            return;

        }
    }

    class ProgramC
    {
        public void main()
        {
            //入力
            string[] s = Console.ReadLine().Split(' ');
            int n = int.Parse(s[0]);
            int k = int.Parse(s[1]);
            double sum = 0.0;

            //
            for (int i = 0; i < n; i++)
            {
                int temp = i + 1;
                int count = 0;

                while (temp < k)
                {
                    temp *= 2;
                    count++;
                }

                sum += Math.Pow(0.5, count) / n;
            }

            Console.WriteLine(sum);
            return;
        }



    }
    
    class ProgramD
    {
        public void main()
        {
            //入力
            int n = int.Parse(Console.ReadLine());

            List<int>[,] list = new List<int>[2, n];

            //インスタンス作成
            for (int i = 0; i < 2; i++)
                for (int j = 0; j < n; j++)
                    list[i, j] = new List<int>();

            //お題を偶奇で入れておく
            for (int i = 0; i < n - 1; i++)
            {
                string[] s = Console.ReadLine().Split(' ');
                list[int.Parse(s[2]) % 2, int.Parse(s[0]) - 1].Add(int.Parse(s[1]) - 1);
                list[int.Parse(s[2]) % 2, int.Parse(s[1]) - 1].Add(int.Parse(s[0]) - 1);
            }

            Queue<int> q = new Queue<int>();

            //答を入れるところ
            int[] ans = new int[n];

            for (int i = 0; i < n; i++)
                ans[i] = -1;

            //1のときをいれる
            ans[0] = 0;
            q.Enqueue(0);

            //幅優先検索
            while(q.Count != 0)
            {
                for(int i = 0;i < q.Count;i++)
                {
                    int t = q.Dequeue();

                    for(int j = 0;j < 2;j++)
                        for(int k = 0;k < list[j,t].Count;k++)
                        {
                            //未訪問の場所のみ検討
                            if(ans[list[j, t][k]] == -1)
                            {
                                ans[list[j, t][k]] = (ans[t] + j) % 2;
                                q.Enqueue(list[j, t][k]);
                            }
                        }
                }
            }


            //最後までやったあまり5を出す
            for (int i = 0; i < n; i++)
                Console.WriteLine(ans[i]);

        }
    }

    class ProgramE
    {
        static void main()
        {

            //入力
            string[] t = Console.ReadLine().Split(' ');
            int n = int.Parse(t[0]);
            int k = int.Parse(t[1]);

            int[] ans = new int[n];
            int count = 0;


            UnionFind tree = new UnionFind();//UnionFindクラスを設定
            tree.par = new int[n];
            tree.temp = new int[n];
            tree.reset(n);

            //木でくっつける
            for (int i = 0; i < k; i++)
            {
                string[] s = Console.ReadLine().Split(' ');
                int u = int.Parse(s[0]);
                int v = int.Parse(s[1]);
                int w = int.Parse(s[2]);
                tree.unite(u - 1, v - 1);
            }

            //それぞれの要素数ごとに数を分類
            for (int i = 0; i < n; i++)
                ans[tree.size(i) - 1]++;

            //要素数がiのものがある分を(i+1)で割れば、分類した木の数が出る
            for (int i = 0; i < n; i++)
                count += ans[i] / (i + 1);


            Console.WriteLine(count);
            return;

        }
    }

    /*UnionFind法のクラス*/
    class UnionFind
    {

        public int[] par;
        public int[] temp;


        //マイナスは根を示す。
        public void reset(int n)
        {
            for (int i = 0; i < n; i++)
                par[i] = -1;
        }

        //マイナスならそれはまだ属していないので根である。そうでないならさかのぼる
        public int root(int x)
        {
            if (par[x] < 0)
                return x;
            else
                return root(par[x]);
        }

        //根の併合を行い、根には要素数を足す（マイナスの値）
        public void unite(int x, int y)
        { // xとyの木を併合
            int rx = root(x); //xの根をrx
            int ry = root(y); //yの根をry
            if (rx == ry)
                return; //xとyの根が同じ(=同じ木にある)時はそのまま
            if (par[ry] > par[rx])
            {
                int temp = ry;
                ry = rx;
                rx = temp;
            }
            par[ry] += par[rx];
            par[rx] = ry; //xとyの根が同じでない(=同じ木にない)時：xの根rxをyの根ryにつける
        }

        // 2つのデータx, yが属する木が同じならtrueを返す
        public bool same(int x, int y)
        {
            int rx = root(x);
            int ry = root(y);
            return rx == ry;
        }

        //根の元に入っている
        public int size(int x)
        {
            return -par[root(x)];
        }
    }

}




    

Measured memory_bytes: 34756