# In a town, there are N people labelled from 1 to N.  There is a rumor that one of these people is secretly the town judge.

# If the town judge exists, then:

#     The town judge trusts nobody.
#     Everybody (except for the town judge) trusts the town judge.
#     There is exactly one person that satisfies properties 1 and 2.

# You are given trust, an array of pairs trust[i] = [a, b] representing that the person labelled a trusts the person labelled b.

# If the town judge exists and can be identified, return the label of the town judge.  Otherwise, return -1.

 

# Example 1:

# Input: N = 2, trust = [[1,2]]
# Output: 2

# Example 2:

# Input: N = 3, trust = [[1,3],[2,3]]
# Output: 3

# Example 3:

# Input: N = 3, trust = [[1,3],[2,3],[3,1]]
# Output: -1

from collections import defaultdict
def findJudge(N,trust):
    if N == 1:
            return 1
    hashmap=defaultdict(int)
    
    for a, b in trust:
        hashmap[a] -=1
        hashmap[b] +=1

    for i in hashmap.keys():
        if hashmap[i] == N-1:
            return i
    return -1
    #edge case
    # if N == 1:
    #     return 1

    # trusted =  [0] * (N+1)
    # for pair_a, pair_b in trust:           
    #     trusted[pair_a] -= 1        
    #     trusted[pair_b] += 1

    # for mole in range(1, N+1):

    #     if trusted[mole] == N-1:
    #         return mole

    # return -1

if __name__ == '__main__':
    # Use the main function here to test out the implementation
    N = 3
    trust = [[1,3],[2,3],[3,1]]

    print(f"The judge is: {findJudge(N,trust)}")
    # Expected Output: -1
           