#include using namespace std; #define int long long int N,M,K; int A[100100]; struct Unionfind{ private: int n; vector par, siz; public: Unionfind(int N){ n = N; par.resize(n,-1); siz.resize(n,1); } int root(int a){ if(par[a] == -1) return a; else return par[a] = root(par[a]); } bool issame(int a, int b){ return (root(a) == root(b)); } int size(int a){ return siz[root(a)]; } bool unite(int a, int b){ a = root(a); b = root(b); if(a == b) return false; if(siz[a] > siz[b]) swap(a,b); siz[b] += siz[a]; par[a] = b; A[b] = max(A[a],A[b]); return true; } }; signed main(){ cin>>N>>M>>K; for(int i=0;i>A[i]; vector> S(M); for(int i=0;i>a>>b; a--; b--; if(A[a] < A[b]) swap(a,b); S[i] = {a,b}; } sort(S.begin(),S.end(),[&](const pair a, pair b){ if(A[a.first] != A[b.first]) return (A[a.first] < A[b.first]); else return (A[a.second] < A[b.second]); }); Unionfind uf(N); for(auto [a,b]:S){ a = uf.root(a); b = uf.root(b); if(uf.issame(a,b)) continue; if(abs(A[a]-A[b]) > K){ cout<<"No"<