import networkx as nx

def comparteixen_amics1(g, a):
    it_comuns = filter(lambda b: next(nx.common_neighbors(g, a, b), None) != None, g[a])
    return set(it_comuns)

def comparteixen_amics2(g, a):
    s = set()
    for b in g[a]:
        if next(nx.common_neighbors(g, a, b), None) != None:
            s.add(b)
    return s

def comparteixen_amics3(g, a):
    graf_veins = g.subgraph(g[a])
    it_comuns = filter(lambda b: graf_veins.degree(b) > 0, graf_veins)
    return set(it_comuns)

def comparteixen_amics4(g, p):
    veins_p = set(g.neighbors(p))
    comp = set(v for v in veins_p if len(veins_p & set(g.neighbors(v))))
    return comp

# Tria la solució que vols provar
comparteixen_amics = comparteixen_amics4

def primera_amistat1(g, a):
    primer_any = min(map(lambda b: g[a][b]['any'], g[a]), default=0)
    it_primers = filter(lambda b: g[a][b]['any'] == primer_any, g[a])
    return min(it_primers, default='')

def primera_amistat2(g, a):
    res = ''
    primer_any = 10000
    for b in g[a]:
        y = g[a][b]['any']
        if  y < primer_any:
            primer_any = y
            res = b
        elif y == primer_any and b < res:
            res = b
    return res

def primera_amistat3(g, a):
    my, mn = min(((y, n2) for n1, n2, y in g.edges(a, data='any')), default=(None, ''))
    return mn

# Tria la solució que vols provar
primera_amistat = primera_amistat3
