Buggy python submission (verdict: Time Limit Exceeded):
from collections import defaultdict
from heapq import *
import sys

int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def MI1(): return map(int1, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def SI(): return sys.stdin.readline()[:-1]

n,m=MI()
to=defaultdict(list)
inf=10**9
dist=defaultdict(int)
home=[set() for _ in range(n)]
for u in range(n):dist[u,-1]=inf
for _ in range(m):
    u,v,c=MI1()
    to[u,c].append(v)
    to[v,c].append(u)
    home[u].add(c)
    home[v].add(c)
    dist[u,c]=dist[v,c]=inf

hp=[]
dist[0,-1]=0
heappush(hp,(0,0,-1))
while hp:
    d,u,c=heappop(hp)
    #print(d,u,c,hp,dist)
    if u==n-1:
        print(d)
        break
    if d>dist[u,c]:continue
    if c==-1:
        for nc in home[u]:
            if d+1<dist[u,nc]:
                dist[u,nc]=d+1
                heappush(hp,(d+1,u,nc))
    else:
        if d<dist[u,-1]:
            dist[u,-1]=d
            heappush(hp,(d,u,-1))
        for v in to[u,c]:
            if d>=dist[v,c]:continue
            dist[v,c]=d
            heappush(hp,(d,v,c))
else:
    print(-1)


Fixed submission:
import sys

int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def MI1(): return map(int1, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def SI(): return sys.stdin.readline()[:-1]

from collections import deque

def solve():
    dist = [inf] * len(to)
    q = deque()
    q.append((0, 0))
    dist[0] = 0
    while q:
        d, i = q.popleft()
        if d > dist[i]: continue
        if i < n:
            for j in to[i]:
                if dist[j] <= d + 1: continue
                dist[j] = d + 1
                q.append((d + 1, j))
        else:
            for j in to[i]:
                if j == n - 1:
                    print(dist[i])
                    exit()
                if dist[j] <= d: continue
                dist[j] = d
                q.appendleft((d, j))
    print(-1)

inf=10**9
n,m=MI()
to=[]
uctoi={}

for u in range(n):
    to.append([])
    uctoi[u,0]=u

for _ in range(m):
    u,v,c=MI()
    u,v=u-1,v-1
    if (u,c) not in uctoi:
        i=uctoi[u,c]=len(to)
        to.append([])
        to[i].append(u)
        to[u].append(i)
    else:i=uctoi[u,c]
    if (v,c) not in uctoi:
        j=uctoi[v,c]=len(to)
        to.append([])
        to[j].append(v)
        to[v].append(j)
    else:j=uctoi[v,c]
    to[i].append(j)
    to[j].append(i)
#print(to)
#print(fin)

solve()

Buggy python submission (verdict: Time Limit Exceeded):
from collections import defaultdict
from heapq import *
import sys

sys.setrecursionlimit(10 ** 6)
int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def MI1(): return map(int1, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def SI(): return sys.stdin.readline()[:-1]

n,m=MI()
to=defaultdict(list)
inf=10**9
dist=defaultdict(int)
home=[set() for _ in range(n)]
for u in range(n):dist[u,-1]=inf
for _ in range(m):
    u,v,c=MI1()
    to[u,c].append((v,c))
    to[v,c].append((u,c))
    home[u].add(c)
    home[v].add(c)
    dist[u,c]=dist[v,c]=inf

hp=[]
dist[0,-1]=0
heappush(hp,(0,0,-1))
while hp:
    d,u,c=heappop(hp)
    #print(d,u,c,hp,dist)
    if u==n-1:
        print(d)
        break
    if d>dist[u,c]:continue
    if c==-1:
        for nc in home[u]:
            if d+1<dist[u,nc]:
                dist[u,nc]=d+1
                heappush(hp,(d+1,u,nc))
    else:
        if d<dist[u,-1]:
            dist[u,-1]=d
            heappush(hp,(d,u,-1))
        for v,_ in to[u,c]:
            if d>=dist[v,c]:continue
            dist[v,c]=d
            heappush(hp,(d,v,c))
else:
    print(-1)


Fixed submission:
import sys

int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def MI1(): return map(int1, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def SI(): return sys.stdin.readline()[:-1]

from collections import deque

def solve():
    dist = [inf] * len(to)
    q = deque()
    q.append((0, 0))
    dist[0] = 0
    while q:
        d, i = q.popleft()
        if d > dist[i]: continue
        if i < n:
            for j in to[i]:
                if dist[j] <= d + 1: continue
                dist[j] = d + 1
                q.append((d + 1, j))
        else:
            for j in to[i]:
                if j == n - 1:
                    print(dist[i])
                    exit()
                if dist[j] <= d: continue
                dist[j] = d
                q.appendleft((d, j))
    print(-1)

inf=10**9
n,m=MI()
to=[]
uctoi={}

for u in range(n):
    to.append([])
    uctoi[u,0]=u

for _ in range(m):
    u,v,c=MI()
    u,v=u-1,v-1
    if (u,c) not in uctoi:
        i=uctoi[u,c]=len(to)
        to.append([])
        to[i].append(u)
        to[u].append(i)
    else:i=uctoi[u,c]
    if (v,c) not in uctoi:
        j=uctoi[v,c]=len(to)
        to.append([])
        to[j].append(v)
        to[v].append(j)
    else:j=uctoi[v,c]
    to[i].append(j)
    to[j].append(i)
#print(to)
#print(fin)

solve()

Buggy python submission (verdict: Time Limit Exceeded):
from heapq import *
import sys

sys.setrecursionlimit(10 ** 6)
int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def MI1(): return map(int1, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def SI(): return sys.stdin.readline()[:-1]

n,m=MI()
to=[[] for _ in range(n)]
inf=10**6
for _ in range(m):
    u,v,c=MI1()
    to[u].append((v,c))
    to[v].append((u,c))
hp=[]
dd={}
heappush(hp,(0,0,-1))
dd[0,-1]=0
while hp:
    d,u,c=heappop(hp)
    if u==n-1:
        print(d)
        break
    if d>dd[u,c]:continue
    for v,nc in to[u]:
        nd=d if c==nc else d+1
        if (v,nc) in dd and nd>=dd[v,nc]:continue
        dd[v,nc]=nd
        heappush(hp,(nd,v,nc))
else:
    print(-1)


Fixed submission:
import sys

int1 = lambda x: int(x) - 1
p2D = lambda x: print(*x, sep="\n")
def II(): return int(sys.stdin.readline())
def MI(): return map(int, sys.stdin.readline().split())
def MI1(): return map(int1, sys.stdin.readline().split())
def LI(): return list(map(int, sys.stdin.readline().split()))
def LLI(rows_number): return [LI() for _ in range(rows_number)]
def SI(): return sys.stdin.readline()[:-1]

from collections import deque

def solve():
    dist = [inf] * len(to)
    q = deque()
    q.append((0, 0))
    dist[0] = 0
    while q:
        d, i = q.popleft()
        if d > dist[i]: continue
        if i < n:
            for j in to[i]:
                if dist[j] <= d + 1: continue
                dist[j] = d + 1
                q.append((d + 1, j))
        else:
            for j in to[i]:
                if j == n - 1:
                    print(dist[i])
                    exit()
                if dist[j] <= d: continue
                dist[j] = d
                q.appendleft((d, j))
    print(-1)

inf=10**9
n,m=MI()
to=[]
uctoi={}

for u in range(n):
    to.append([])
    uctoi[u,0]=u

for _ in range(m):
    u,v,c=MI()
    u,v=u-1,v-1
    if (u,c) not in uctoi:
        i=uctoi[u,c]=len(to)
        to.append([])
        to[i].append(u)
        to[u].append(i)
    else:i=uctoi[u,c]
    if (v,c) not in uctoi:
        j=uctoi[v,c]=len(to)
        to.append([])
        to[j].append(v)
        to[v].append(j)
    else:j=uctoi[v,c]
    to[i].append(j)
    to[j].append(i)
#print(to)
#print(fin)

solve()