class unif: def __init__(self,n): self.pare=[-1]*n self.size=[1]*n self.big=[0]*n def root(self,x): while self.pare[x]!=-1: x=self.pare[x] return x def unite(self,u,v): rootu=self.root(u) rootv=self.root(v) if rootu!=rootv: if self.size[rootu]>=self.size[rootv]: self.pare[rootv]=rootu self.size[rootu]+=self.size[rootv] self.big[rootu]=max(self.big[rootu],self.big[rootv]) else: self.pare[rootu]=rootv self.size[rootv]+=self.size[rootu] self.big[rootv]=max(self.big[rootu],self.big[rootv]) def same(self,s,t): return self.root(s)==self.root(t) N,M,K=map(int,input().split()) A=list(map(int,input().split())) G=[[] for i in range(N)] for i in range(M): a,b=map(int,input().split()) a-=1 b-=1 if A[a]>A[b]: G[a].append(b) else: G[b].append(a) L=[] for i in range(N): L.append((A[i],i)) L.sort() Z=unif(N) for i in range(N): Z.big[i]=A[i] for i in range(N): a=L[i][1] for b in G[a]: x=Z.root(a) y=Z.root(b) if Z.big[x]>Z.big[y]+K: print('No') exit() Z.unite(a,b) print('Yes')