Buggy python submission (verdict: Time Limit Exceeded):
# -*- coding: utf-8 -*-
# IMPORT ###############################################################################################################
import sys                                                      # システム
sys.setrecursionlimit(10**6)                                    # 再帰処理の上限変更
from collections import deque, Counter                          # キュー・個数カウント
from itertools   import accumulate, permutations, combinations  # 累積和・順列・組み合わせ
from operator    import itemgetter                              # ソート補助
from bisect      import bisect_left, bisect_right, bisect       # 二分探索
from heapq       import heappop, heappush                       # プライオリティキュー
from fractions   import gcd                                     # 最大公約数
from math        import ceil, floor, sqrt, cos, sin, tan, pi    # 数学処理
from copy        import deepcopy                                # オブジェクトコピー
import numpy         as np                                      # 数値計算

# MAIN #################################################################################################################
def main():
    # Init #############################################################################################################
    im = InputManager()
    # Input ############################################################################################################
    n = im.inputSingle()
    nodes = [Node(i+1) for i in range(n)]
    for i in range(n-1):
        u, v, w = im.inputMultiple()
        nodes[u-1].addConnection(nodes[v-1], w)
        nodes[v-1].addConnection(nodes[u-1], w)
    # Logic ############################################################################################################
    weights = [-1 for i in range(n)]
    for i in range(n):
        weights[i] = Node.rootFind(nodes[0], nodes[i], [nodes[i]], 0)
    # Output ###########################################################################################################
    # print(weights)
    for weight in weights:
        if weight % 2 == 0:
            print(0)
        else:
            print(1)
    # Return ###########################################################################################################
    return

class Node(object):
    def __init__(self, index):
        self._index = index
        self._connections = []
    
    @property
    def connections(self):
        return self._connections
    
    def addConnection(self, node, weight):
        self._connections.append({"node": node, "weight": weight})
    
    def __eq__(self, other):
        return self._index == other._index
    
    @staticmethod
    def rootFind(targetNode, baseNode, excludeNodes, weight):
        if baseNode == targetNode:
            # print("Founded: " + str(weight))
            return weight
        for connection in baseNode.connections:
            if connection["node"] in excludeNodes:
                continue
            else:
                # print(str(baseNode._index) + " -> " + str(connection["node"]._index) + " : " + str([exclude._index for exclude in excludeNodes]))
                tmpExcludeNodes = deepcopy(excludeNodes)
                tmpExcludeNodes.append(connection["node"])
                calculatedWeight = Node.rootFind(targetNode, connection["node"], tmpExcludeNodes, weight + connection["weight"])
                if calculatedWeight > 0:
                    return calculatedWeight
        # print("Not Founded")
        return -1

# INPUT MANAGER ########################################################################################################
class InputManager(object):
    def __init__(self):
        pass

    @staticmethod
    def inputSingle(dtype=int):
        return dtype(input())
    
    @staticmethod
    def inputMultiple(dtype=int, aslist=False):
        if aslist:
            return list(map(dtype, input().split()))
        else:
            return map(dtype, input().split())

    @staticmethod
    def input2D(h, dtype=int):
        return [list(map(dtype, input().split())) for i in range(h)]

# CALL MAIN ############################################################################################################
main()

Fixed submission:
# -*- coding: utf-8 -*-
# IMPORT ###############################################################################################################
import sys                                                      # システム
sys.setrecursionlimit(10**6)                                    # 再帰処理の上限変更
from collections import deque, Counter                          # キュー・個数カウント
from itertools   import accumulate, permutations, combinations  # 累積和・順列・組み合わせ
from operator    import itemgetter                              # ソート補助
from bisect      import bisect_left, bisect_right, bisect       # 二分探索
from heapq       import heappop, heappush                       # プライオリティキュー
from fractions   import gcd                                     # 最大公約数
from math        import ceil, floor, sqrt, cos, sin, tan, pi    # 数学処理
from copy        import deepcopy                                # オブジェクトコピー
import numpy         as np                                      # 数値計算

# MAIN #################################################################################################################
def main():
    # Init #############################################################################################################
    im = InputManager()
    # Input ############################################################################################################
    n = im.inputSingle()
    nodes = [Node(i) for i in range(n)]
    for i in range(n-1):
        u, v, w = im.inputMultiple()
        nodes[u-1].addConnection(nodes[v-1], w)
        nodes[v-1].addConnection(nodes[u-1], w)
    # Logic ############################################################################################################
    weights = [-1 for i in range(n)]
    Node.calcWeights(nodes[0], 0, weights)
    # Output ###########################################################################################################
    for weight in weights:
        if weight % 2 == 0:
            print(0)
        else:
            print(1)
    # Return ###########################################################################################################
    return

class Node(object):
    def __init__(self, index):
        self._index = index
        self._connections = []
    
    @property
    def connections(self):
        return self._connections
    
    def addConnection(self, node, weight):
        self._connections.append({"node": node, "weight": weight})
    
    def __eq__(self, other):
        return self._index == other._index
    
    @staticmethod
    def calcWeights(node, weight, weights):
        weights[node._index] = weight
        if - 1 not in weights:
            return
        for connection in node.connections:
            if weights[connection["node"]._index] == -1:
                Node.calcWeights(connection["node"], weight+connection["weight"], weights)

# INPUT MANAGER ########################################################################################################
class InputManager(object):
    def __init__(self):
        pass

    @staticmethod
    def inputSingle(dtype=int):
        return dtype(input())
    
    @staticmethod
    def inputMultiple(dtype=int, aslist=False):
        if aslist:
            return list(map(dtype, input().split()))
        else:
            return map(dtype, input().split())

    @staticmethod
    def input2D(h, dtype=int):
        return [list(map(dtype, input().split())) for i in range(h)]

# CALL MAIN ############################################################################################################
main()