#include //#include using namespace std; //using namespace atcoder; using ll = long long; using ull = unsigned long long; using ld = long double; //using mint = modint998244353; void dfs(ll x, vector> &pass, vector &come, vector &p){ for(ll i : pass[x]){ if(come[i])continue; come[i] = 1; dfs(i,pass,come,p); } p.push_back(x); } void rdfs(ll x, vector> &rpass, vector &rcome, vector &list){ for(ll i : rpass[x]){ if(rcome[i])continue; rcome[i] = 1; list.push_back(i); rdfs(i,rpass,rcome,list); } } int main(){ cin.tie(nullptr); ios_base::sync_with_stdio(false); ll n,m,k; cin >> n >> m >> k; vector> pass(n,vector(0)); vector> rpass(n,vector(0)); vector come(n,0); vector rcome(n,0); vector p(0); vector> css(0); vector wh(n,-1); ll u,v; for(ll i = 0; i < m; i++){ cin >> u >> v; u--; v--; pass[u].push_back(v); rpass[v].push_back(u); } for(ll i = 0; i < n; i++){ if(come[i])continue; come[i] = 1; dfs(i,pass,come,p); } reverse(p.begin(),p.end()); for(ll i = 0; i < n; i++){ if(rcome[p[i]])continue; rcome[p[i]] = 1; vector list = {p[i]}; rdfs(i,rpass,rcome,list); for(ll t : list){ wh[t] = css.size(); } css.push_back({list}); } ///////////////////CSS//////////////////////////// ll siz = css.size(); bool ans = 1; if(wh[0] != 0)ans = 0; if(css[0].size() == 1)ans = 0; for(ll i = 0; i < siz-1; i++){ if(css[i].size() * css[i+1].size() == 1)ans = 0; bool ok = 0; for(ll t : css[i]){ for(ll j : pass[t]){ if(wh[j] == i+1){ ok = 1; break; } } if(ok)break; } if(!ok){ ans = 0; break; } } queue> bfs; vector> dp(n,vector(2,0)); for(ll i = 0; i < siz; i++){ if(css[i].size() == 1)continue; bfs.push({css[i][0],0}); dp[css[i][0]][0] = 1; while(!bfs.empty()){ ll x = bfs.front().first; ll q = bfs.front().second; bfs.pop(); for(ll t : pass[x]){ ll nq = q * -1 + 1; if(wh[t] != i)continue; if(dp[t][nq])continue; dp[t][nq] = 1; bfs.push({t,nq}); } } if(!dp[css[i][0]][1]){ ans = 0; break; } } if(ans)cout << "Yes" << '\n'; else cout << "No" << '\n'; }