from collections import deque

def zero_one_bfs(adj, source):
    dist = [float('inf')] * len(adj)
    dist[source] = 0
    queue = deque([(0, source)])
    while queue:
        distance, u = queue.popleft()
        if distance != dist[u]:
            continue
        for v, weight in adj[u]:
            candidate = distance + weight
            if candidate < dist[v]:
                dist[v] = candidate
                entry = (candidate, v)
                if weight == 0:
                    queue.appendleft(entry)
                else:
                    queue.append(entry)
    return [None if value == float('inf') else value for value in dist]
