class UnionFindTree:
    def __init__(self, n):
        self.nodes = [-1] * n #根にサイズを負の値で格納する。
    def find(self, i):
        if self.nodes[i] < 0: #値が負の場合は根
            return i
        else:
            self.nodes[i] = self.find(self.nodes[i]) #縮約
            return self.nodes[i]

    def union(self, i, j):
        i = self.find(i)
        j = self.find(j)
        if i == j:
            return
        if self.nodes[i] > self.nodes[j]: #サイズ比較してiの方がサイズが大きいようにする
            i, j = j, i
        self.nodes[i] += self.nodes[j] #大きい方に小さい方を統合しサイズを登録する。
        self.nodes[j] = i # jの親はi
    
    def size(self, i): # 所属する集合の大きさを返す
        i = self.find(i)
        return -self.nodes[i]

n = int(input())
uft = UnionFindTree(2 * n)
for _ in range(n-1):
    u, v, w = map(int, input().split())
    u -= 1
    v -= 1
    if w % 2 == 0:
        uft.union(u, v)
        uft.union(u + n, v + n)
    else:
        uft.union(u + n, v)
        uft.union(u, v + n)

x = uft.find(0)
for i in range(n):
    print(0 if uft.find(i) == x else 1) class UnionFindTree:
    def __init__(self, n):
        self.nodes = [-1] * n #根にサイズを負の値で格納する。
    def find(self, i):
        if self.nodes[i] < 0: #値が負の場合は根
            return i
        else:
            self.nodes[i] = self.find(self.nodes[i]) #縮約
            return self.nodes[i]

    def union(self, i, j):
        i = self.find(i)
        j = self.find(j)
        if i == j:
            return
        if self.nodes[i] > self.nodes[j]: #サイズ比較してiの方がサイズが大きいようにする
            i, j = j, i
        self.nodes[i] += self.nodes[j] #大きい方に小さい方を統合しサイズを登録する。
        self.nodes[j] = i # jの親はi
    
    def size(self, i): # 所属する集合の大きさを返す
        i = self.find(i)
        return -self.nodes[i] UnionFindTree def __init__(self, n):
        self.nodes = [-1] * n #根にサイズを負の値で格納する。
     __init__ self.nodes = [-1] * n self.nodes self nodes [-1] * n [-1] -1 n self self n n def find(self, i):
        if self.nodes[i] < 0: #値が負の場合は根
            return i
        else:
            self.nodes[i] = self.find(self.nodes[i]) #縮約
            return self.nodes[i]

     find if self.nodes[i] < 0: #値が負の場合は根
            return i
        else:
            self.nodes[i] = self.find(self.nodes[i]) #縮約
            return self.nodes[i]

     self.nodes[i] < 0 self.nodes[i] self.nodes self nodes i 0 return i i self.nodes[i] = self.find(self.nodes[i]) self.nodes[i] self.nodes self nodes i self.find(self.nodes[i]) self.find self find self.nodes[i] self.nodes self nodes i return self.nodes[i] self.nodes[i] self.nodes self nodes i self self i i def union(self, i, j):
        i = self.find(i)
        j = self.find(j)
        if i == j:
            return
        if self.nodes[i] > self.nodes[j]: #サイズ比較してiの方がサイズが大きいようにする
            i, j = j, i
        self.nodes[i] += self.nodes[j] #大きい方に小さい方を統合しサイズを登録する。
        self.nodes[j] = i # jの親はi
    
     union i = self.find(i) i self.find(i) self.find self find i j = self.find(j) j self.find(j) self.find self find j if i == j:
            return
         i == j i j return if self.nodes[i] > self.nodes[j]: #サイズ比較してiの方がサイズが大きいようにする
            i, j = j, i
         self.nodes[i] > self.nodes[j] self.nodes[i] self.nodes self nodes i self.nodes[j] self.nodes self nodes j i, j = j, i i j j i self.nodes[i] += self.nodes[j] self.nodes[i] self.nodes self nodes i self.nodes[j] self.nodes self nodes j self.nodes[j] = i self.nodes[j] self.nodes self nodes j i self self i i j j def size(self, i): # 所属する集合の大きさを返す
        i = self.find(i)
        return -self.nodes[i] size i = self.find(i) i self.find(i) self.find self find i return -self.nodes[i] -self.nodes[i] self.nodes[i] self.nodes self nodes i self self i i n = int(input()) n int(input()) int input() input uft = UnionFindTree(2 * n) uft UnionFindTree(2 * n) UnionFindTree 2 * n 2 n for _ in range(n-1):
    u, v, w = map(int, input().split())
    u -= 1
    v -= 1
    if w % 2 == 0:
        uft.union(u, v)
        uft.union(u + n, v + n)
    else:
        uft.union(u + n, v)
        uft.union(u, v + n) _ range(n-1) range n-1 n 1 u, v, w = map(int, input().split()) u map(int, input().split()) map int input().split() ().split () input split v w u -= 1 u 1 v -= 1 v 1 if w % 2 == 0:
        uft.union(u, v)
        uft.union(u + n, v + n)
    else:
        uft.union(u + n, v)
        uft.union(u, v + n) w % 2 == 0 w % 2 w 2 0 uft.union(u, v) uft.union uft union u v uft.union(u + n, v + n) uft.union uft union u + n u n v + n v n uft.union(u + n, v) uft.union uft union u + n u n v uft.union(u, v + n) uft.union uft union u v + n v n x = uft.find(0) x uft.find(0) uft.find uft find 0 for i in range(n):
    print(0 if uft.find(i) == x else 1) i range(n) range n print(0 if uft.find(i) == x else 1) print 0 if uft.find(i) == x else 1 uft.find(i) == x uft.find(i) uft.find uft find i x 0 1 v, w = map(int, input().split()) map(int, input().split()) v class UnionFindTree:
    def __init__(self, n):
        self.nodes = [-1] * n #根にサイズを負の値で格納する。
    def find(self, i):
        if self.nodes[i] < 0: #値が負の場合は根
            return i
        else:
            self.nodes[i] = self.find(self.nodes[i]) #縮約
            return self.nodes[i]

    def union(self, i, j):
        i = self.find(i)
        j = self.find(j)
        if i == j:
            return
        if self.nodes[i] > self.nodes[j]: #サイズ比較してiの方がサイズが大きいようにする
            i, j = j, i
        self.nodes[i] += self.nodes[j] #大きい方に小さい方を統合しサイズを登録する。
        self.nodes[j] = i # jの親はi
    
    def size(self, i): # 所属する集合の大きさを返す
        i = self.find(i)
        return -self.nodes[i] class UnionFindTree:
    def __init__(self, n):
        self.nodes = [-1] * n #根にサイズを負の値で格納する。
    def find(self, i):
        if self.nodes[i] < 0: #値が負の場合は根
            return i
        else:
            self.nodes[i] = self.find(self.nodes[i]) #縮約
            return self.nodes[i]

    def union(self, i, j):
        i = self.find(i)
        j = self.find(j)
        if i == j:
            return
        if self.nodes[i] > self.nodes[j]: #サイズ比較してiの方がサイズが大きいようにする
            i, j = j, i
        self.nodes[i] += self.nodes[j] #大きい方に小さい方を統合しサイズを登録する。
        self.nodes[j] = i # jの親はi
    
    def size(self, i): # 所属する集合の大きさを返す
        i = self.find(i)
        return -self.nodes[i] UnionFindTree w = map(int, input().split()) map(int, input().split()) w v -= 1 1 v u, v, w = map(int, input().split()) map(int, input().split()) u u -= 1 1 u n = int(input()) int(input()) n uft = UnionFindTree(2 * n) UnionFindTree(2 * n) uft x = uft.find(0) uft.find(0) x
class UnionFindTree:
    def __init__(self, n):
        self.nodes = [-1] * n #根にサイズを負の値で格納する。
    def find(self, i):
        if self.nodes[i] < 0: #値が負の場合は根
            return i
        else:
            self.nodes[i] = self.find(self.nodes[i]) #縮約
            return self.nodes[i]

    def union(self, i, j):
        i = self.find(i)
        j = self.find(j)
        if i == j:
            return
        if self.nodes[i] > self.nodes[j]: #サイズ比較してiの方がサイズが大きいようにする
            i, j = j, i
        self.nodes[i] += self.nodes[j] #大きい方に小さい方を統合しサイズを登録する。
        self.nodes[j] = i # jの親はi
    
    def size(self, i): # 所属する集合の大きさを返す
        i = self.find(i)
        return -self.nodes[i]

n = int(input())
uft = UnionFindTree(2 * n)
for _ in range(n-1):
    u, v, w = map(int, input().split())
    u -= 1
    v -= 1
    if w % 2 == 0:
        uft.union(u, v)
        uft.union(u + n, v + n)
    else:
        uft.union(u + n, v)
        uft.union(u, v + n)

x = uft.find(0)
for i in range(n):
    print(0 if uft.find(i) == x else 1)