# -*- coding: utf-8 -*-
"""
@author: H_Hoshigi
49min 40sec
"""
# 0番目の頂点から各頂点までの距離を求めて、
# その距離の偶奇を判定すればよいだろう。
# 木だから頂点同士の距離は1通りしかない。

def main():
    N = int(input())
    edge_list = [list(map(int, input().split()))  for i in range(N-1)]

    # 頂点uから頂点vに距離wの辺があることを、
    # 隣接リストadj_listのu番目の要素に[v, w]があることとして書く。
    # 今距離wは偶奇しか興味が無いので、w%2に置き換える。
    # 頂点の番号は、入力では1インデックスなので、0インデックスに変える。
    # 無向グラフなので、両向きとも入力する。
    adj_list = [[] for i in range(N)]
    for edge in edge_list:
        adj_list[edge[0]-1].append([edge[1]-1, edge[2]%2])
        adj_list[edge[1]-1].append([edge[0]-1, edge[2]%2])

    # 各頂点の頂点0からの距離のリスト
    INF = 2
    distance_list = [ INF for i in range(N)]
    distance_list[0] = 0

    # dfsのためのスタック
    dfs_list = [0]

    # dfs
    while dfs_list:
        now_node = dfs_list.pop(-1)
        now_dist = distance_list[now_node]
        for edge in adj_list[now_node]:
            if distance_list[edge[0]] == INF:
                distance_list[edge[0]] = (now_dist+edge[1])%2
                dfs_list.append(edge[0])
    
    # 答えの出力
    for dist in distance_list:
        print(dist)
    return

if __name__ == "__main__":
    main()
 """
@author: H_Hoshigi
49min 40sec
""" def main():
    N = int(input())
    edge_list = [list(map(int, input().split()))  for i in range(N-1)]

    # 頂点uから頂点vに距離wの辺があることを、
    # 隣接リストadj_listのu番目の要素に[v, w]があることとして書く。
    # 今距離wは偶奇しか興味が無いので、w%2に置き換える。
    # 頂点の番号は、入力では1インデックスなので、0インデックスに変える。
    # 無向グラフなので、両向きとも入力する。
    adj_list = [[] for i in range(N)]
    for edge in edge_list:
        adj_list[edge[0]-1].append([edge[1]-1, edge[2]%2])
        adj_list[edge[1]-1].append([edge[0]-1, edge[2]%2])

    # 各頂点の頂点0からの距離のリスト
    INF = 2
    distance_list = [ INF for i in range(N)]
    distance_list[0] = 0

    # dfsのためのスタック
    dfs_list = [0]

    # dfs
    while dfs_list:
        now_node = dfs_list.pop(-1)
        now_dist = distance_list[now_node]
        for edge in adj_list[now_node]:
            if distance_list[edge[0]] == INF:
                distance_list[edge[0]] = (now_dist+edge[1])%2
                dfs_list.append(edge[0])
    
    # 答えの出力
    for dist in distance_list:
        print(dist)
    return main N = int(input()) N int(input()) int input() input list(map(int, input().split()))  for i in range(N-1) for i in range(N-1) i range(N-1) range N-1 N 1 for i in range(N-1) list(map(int, input().split())) list map(int, input().split()) map int input().split() ().split () input split edge_list = [list(map(int, input().split()))  for i in range(N-1)] edge_list [list(map(int, input().split()))  for i in range(N-1)] [] for i in range(N) for i in range(N) i range(N) range N for i in range(N) [] adj_list = [[] for i in range(N)] adj_list [[] for i in range(N)] for edge in edge_list:
        adj_list[edge[0]-1].append([edge[1]-1, edge[2]%2])
        adj_list[edge[1]-1].append([edge[0]-1, edge[2]%2])

    # 各頂点の頂点0からの距離のリスト
     edge edge_list adj_list[edge[0]-1].append([edge[1]-1, edge[2]%2]) [edge[0]-1].append [edge[0]-1] adj_list edge[0]-1 edge[0] edge 0 1 append [edge[1]-1, edge[2]%2] edge[1]-1 edge[1] edge 1 1 edge[2]%2 edge[2] edge 2 2 adj_list[edge[1]-1].append([edge[0]-1, edge[2]%2]) [edge[1]-1].append [edge[1]-1] adj_list edge[1]-1 edge[1] edge 1 1 append [edge[0]-1, edge[2]%2] edge[0]-1 edge[0] edge 0 1 edge[2]%2 edge[2] edge 2 2 INF = 2 INF 2 INF for i in range(N) for i in range(N) i range(N) range N for i in range(N) INF distance_list = [ INF for i in range(N)] distance_list [ INF for i in range(N)] distance_list[0] = 0 distance_list[0] distance_list 0 0 dfs_list = [0] dfs_list [0] 0 while dfs_list:
        now_node = dfs_list.pop(-1)
        now_dist = distance_list[now_node]
        for edge in adj_list[now_node]:
            if distance_list[edge[0]] == INF:
                distance_list[edge[0]] = (now_dist+edge[1])%2
                dfs_list.append(edge[0])
    
    # 答えの出力
     dfs_list now_node = dfs_list.pop(-1) now_node dfs_list.pop(-1) dfs_list.pop dfs_list pop -1 now_dist = distance_list[now_node] now_dist distance_list[now_node] distance_list now_node for edge in adj_list[now_node]:
            if distance_list[edge[0]] == INF:
                distance_list[edge[0]] = (now_dist+edge[1])%2
                dfs_list.append(edge[0])
    
    # 答えの出力
     edge adj_list[now_node] adj_list now_node if distance_list[edge[0]] == INF:
                distance_list[edge[0]] = (now_dist+edge[1])%2
                dfs_list.append(edge[0])
    
    # 答えの出力
     distance_list[edge[0]] == INF distance_list[edge[0]] distance_list edge[0] edge 0 INF distance_list[edge[0]] = (now_dist+edge[1])%2 distance_list[edge[0]] distance_list edge[0] edge 0 (now_dist+edge[1])%2 now_dist+edge[1] now_dist edge[1] edge 1 2 dfs_list.append(edge[0]) dfs_list.append dfs_list append edge[0] edge 0 for dist in distance_list:
        print(dist)
     dist distance_list print(dist) print dist return if __name__ == "__main__":
    main() __name__ == "__main__" __name__ "__main__" main() main def main():
    N = int(input())
    edge_list = [list(map(int, input().split()))  for i in range(N-1)]

    # 頂点uから頂点vに距離wの辺があることを、
    # 隣接リストadj_listのu番目の要素に[v, w]があることとして書く。
    # 今距離wは偶奇しか興味が無いので、w%2に置き換える。
    # 頂点の番号は、入力では1インデックスなので、0インデックスに変える。
    # 無向グラフなので、両向きとも入力する。
    adj_list = [[] for i in range(N)]
    for edge in edge_list:
        adj_list[edge[0]-1].append([edge[1]-1, edge[2]%2])
        adj_list[edge[1]-1].append([edge[0]-1, edge[2]%2])

    # 各頂点の頂点0からの距離のリスト
    INF = 2
    distance_list = [ INF for i in range(N)]
    distance_list[0] = 0

    # dfsのためのスタック
    dfs_list = [0]

    # dfs
    while dfs_list:
        now_node = dfs_list.pop(-1)
        now_dist = distance_list[now_node]
        for edge in adj_list[now_node]:
            if distance_list[edge[0]] == INF:
                distance_list[edge[0]] = (now_dist+edge[1])%2
                dfs_list.append(edge[0])
    
    # 答えの出力
    for dist in distance_list:
        print(dist)
    return def main():
    N = int(input())
    edge_list = [list(map(int, input().split()))  for i in range(N-1)]

    # 頂点uから頂点vに距離wの辺があることを、
    # 隣接リストadj_listのu番目の要素に[v, w]があることとして書く。
    # 今距離wは偶奇しか興味が無いので、w%2に置き換える。
    # 頂点の番号は、入力では1インデックスなので、0インデックスに変える。
    # 無向グラフなので、両向きとも入力する。
    adj_list = [[] for i in range(N)]
    for edge in edge_list:
        adj_list[edge[0]-1].append([edge[1]-1, edge[2]%2])
        adj_list[edge[1]-1].append([edge[0]-1, edge[2]%2])

    # 各頂点の頂点0からの距離のリスト
    INF = 2
    distance_list = [ INF for i in range(N)]
    distance_list[0] = 0

    # dfsのためのスタック
    dfs_list = [0]

    # dfs
    while dfs_list:
        now_node = dfs_list.pop(-1)
        now_dist = distance_list[now_node]
        for edge in adj_list[now_node]:
            if distance_list[edge[0]] == INF:
                distance_list[edge[0]] = (now_dist+edge[1])%2
                dfs_list.append(edge[0])
    
    # 答えの出力
    for dist in distance_list:
        print(dist)
    return main
# -*- coding: utf-8 -*-
"""
@author: H_Hoshigi
49min 40sec
"""
# 0番目の頂点から各頂点までの距離を求めて、
# その距離の偶奇を判定すればよいだろう。
# 木だから頂点同士の距離は1通りしかない。

def main():
    N = int(input())
    edge_list = [list(map(int, input().split()))  for i in range(N-1)]

    # 頂点uから頂点vに距離wの辺があることを、
    # 隣接リストadj_listのu番目の要素に[v, w]があることとして書く。
    # 今距離wは偶奇しか興味が無いので、w%2に置き換える。
    # 頂点の番号は、入力では1インデックスなので、0インデックスに変える。
    # 無向グラフなので、両向きとも入力する。
    adj_list = [[] for i in range(N)]
    for edge in edge_list:
        adj_list[edge[0]-1].append([edge[1]-1, edge[2]%2])
        adj_list[edge[1]-1].append([edge[0]-1, edge[2]%2])

    # 各頂点の頂点0からの距離のリスト
    INF = 2
    distance_list = [ INF for i in range(N)]
    distance_list[0] = 0

    # dfsのためのスタック
    dfs_list = [0]

    # dfs
    while dfs_list:
        now_node = dfs_list.pop(-1)
        now_dist = distance_list[now_node]
        for edge in adj_list[now_node]:
            if distance_list[edge[0]] == INF:
                distance_list[edge[0]] = (now_dist+edge[1])%2
                dfs_list.append(edge[0])
    
    # 答えの出力
    for dist in distance_list:
        print(dist)
    return

if __name__ == "__main__":
    main()

