#include #define ALL(x) (x).begin(),(x).end() #define LB(v,x) (int)(lower_bound(ALL(v),x)-(v).begin()) #define UQ(v) sort(ALL(v)),(v).erase(unique(ALL(v)),(v).end()) #define IO ios::sync_with_stdio(false),cin.tie(nullptr); #define chmax(a,b)(a)=(a)<(b)?(b):(a) #define chmin(a,b)(a)=(a)<(b)?(a):(b) using namespace std; using ll=long long; const int INF=1e9+10; const ll INFL=4e18; struct DSU{ DSU()=default; DSU(int n){ par.resize(n); iota(par.begin(),par.end(),0); sz.assign(n,1); forest_count=n; } int find(int x){ if(par[x]==x)return x; return par[x]=find(par[x]); } bool merge(int x,int y){ x=find(x),y=find(y); if(x==y)return false; if(sz[x]>groups(){ int n=par.size(); vector>ret(n); for(int i=0;i&v){return v.empty();}),ret.end()); return ret; } private: vectorpar,sz; int forest_count; }; /* 操作をする→頂点を縮約できる 最終的に1つの頂点にできるか? */ int main(){ ll N,M,K;cin>>N>>M>>K; vector>A(N); for(int i=0;i>get<0>(A[i]),get<2>(A[i])=i; sort(ALL(A)); vectorinv(N); for(int i=0;i(A[i])=i,inv[get<2>(A[i])]=i; vector>>G(N); for(int i=0;i>u>>v,u--,v--; G[u].insert(A[inv[v]]); G[v].insert(A[inv[u]]); } vectorseen(N,false); DSU dsu(N); for(auto a:A){ auto[v,n,i]=a; if(G[i].count(a))G[i].erase(a); auto itr=G[i].lower_bound({v,n+1,-1}); if(itr==G[i].end())continue; auto[v2,n2,i2]=*itr; if(abs(v2-v)>K)continue; dsu.merge(i,i2); if(ssize(G[i])>ssize(G[i2]))G[i].swap(G[i2]); for(auto p:G[i])G[i2].insert(p); } puts(dsu.count()==1?"Yes":"No"); }