#pragma GCC target("avx") #pragma GCC optimize("O3") #pragma GCC optimize("unroll-loops") #include using namespace std; vector> tree; vector>edge; int root; bool dfs(int now){ if(tree[now].empty())return false; int ch=(edge[now].second-edge[now].first-1)%2; bool f[2]={false,false}; for(auto x:tree[now]){ f[dfs(x)]=true; ch^=(edge[x].second-edge[x].first-1)%2; } if(f[1]&&(f[0]|ch)){ puts("5"); exit(0); } return f[0]; } int main(){ int i,N,M; cin>>N>>M; tree.resize(M); edge.resize(M); if(M==0){ putchar('4'+N%2); putchar('\n'); return 0; } vector ver; map,int> edgenum; for(int i=0;i>u>>v; --u;--v; edge[i]=pair(u,v); edgenum[edge[i]]=i; ver.emplace_back(u); ver.emplace_back(v); } sort(ver.begin(),ver.end()); ver.erase(unique(ver.begin(),ver.end()),ver.end()); for(size_t i=0;i> kukan=edge; sort(kukan.begin(),kukan.end(),[](pair l,pair r){ return l.first!=r.first?l.firstr.second; }); vector> rootlis; for(auto x:kukan){ auto [l,r]=x; if(rootlis.empty()){ rootlis.emplace_back(x); continue; } while(rootlis.size()&&rootlis.back().second<=l)rootlis.pop_back(); assert(rootlis.size()); tree[edgenum[rootlis.back()]].emplace_back(edgenum[x]); } root=edgenum[kukan[0]]; if(dfs(root))puts("4"); else puts("5"); }