#include <bits/stdc++.h>
using namespace std;
using ll=long long int;
using ld=long double;
using VI=vector<ll>;
using VD=vector<ld>;
using VVI=vector<VI>;
using VC=vector<char>;
using VVC=vector<VC>;
using VS=vector<string>;
using PLL =pair<ll,ll>;
using PLD=pair<ld,ld>;
using VPLL=vector<PLL>;
#define REP(i,n) for(ll i=0;i<(ll)(n);i++)
#define REPD(i,n) for(ll i=(ll)(n)-1;i>=0;i--)
#define ALL(x) (x).begin(),(x).end()
#define ALLR(x) (x).rbegin(),(x).rend()
#define SIZE(x) ((ll)(x).size())
#define MAX(x) *max_element((x).begin(),(x).end())
#define MIN(x) *min_element((x).begin(),(x).end())
#define SORTR(x) sort((x).rbegin(),(x).rend())
#define SORT(x) sort((x).begin(),(x).end())
#define SUM(x) accumulate((x).begin(),(x).end(), 0)
#define FILL(x,a) fill(x.begin(),x.end(),a)
#define EACH(i,x) for(typeof((x).begin()) i=(x).begin(); i!=(x).end(); ++i)
#define COUT(x) cout<<x<<"\n"

const ll INF = 1e18;
const ld EPS   = 1e-10;
const int MOD  = int(1e9)+7;
template<class T>bool chmax(T &a, const T &b) { if (a<b) { a=b; return 1; } return 0; }
template<class T>bool chmin(T &a, const T &b) { if (b<a) { a=b; return 1; } return 0; }
template <class BidirectionalIterator>
bool next_partial_permutation(BidirectionalIterator first, BidirectionalIterator middle,BidirectionalIterator last){reverse(middle, last); return next_permutation(first , last);}
ll gcd(ll x, ll y) { return (x % y)? gcd(y, x % y): y; }
ll lcm(ll x, ll y) { return x / gcd(x, y) * y; }
ll GCD(VI v){ll a = v[0]; for (ll i = 1; i<SIZE(v); i++) {a = gcd(a, v[i]);} return a;}
ll LCM(VI v){ll a = v[0]; for (ll i = 1; i<SIZE(v); i++) {a = lcm(a, v[i]);} return a;}

class UnionFind{
public:
	vector<int> par;	// par[i]:iの親の番号 (例) par[3] = 2 : 3の親が2
	vector<int> rank;	//ランク
	vector<ll> diff_weight;

	UnionFind(int N=1,int SUM_UNITY=0){
		par.resize(N),	rank.resize(N),	diff_weight.resize(N);
		for (int i = 0; i < N; ++i) par[i] = i,rank[i]=0,diff_weight[i]=SUM_UNITY;
	}
	int root(int x){// データxが属する木の根を再帰で得る：root(x) = {xの木の根}
		if(par[x]==x)return x;
		else{
			int r=root(par[x]);
			diff_weight[x]+=diff_weight[par[x]];	//累積和を取る
			return par[x]=r;
		}
	};

	bool issame(int x,int y){
		return(root(x)==root(y));
	};

	// weight(ry)-weight(rx)=wとなるようにmergeする
	bool merge(int x,int y,int w){
		w+=weight(x);		//rootとの重み差分を補正
		w-=weight(y);
		int rx = root(x); 	//xの根をrx
		int ry = root(y); 	//yの根をry
		if (rx == ry) return false; //xとyの根が同じ(=同じ木にある)時はそのまま
		if(rank[rx]<rank[ry])	swap(rx, ry),w=-w;// rank[rx] >= rank[ry] となるように rx と ry を swap (それに合わせて w も符号反転します)
		if (rank[rx] == rank[ry]) ++rank[rx];// y (のroot) を x (のroot) の下にくっつける
		par[ry] = rx; 		//xとyの根が同じでない(=同じ木にない)時：xの根rxをyの根ryにつける
		diff_weight[ry]=w;	// x が y の親になるので、x と y の差分を diff_weight[y] に記録
		return true;
	}
	ll weight(int x){
		root(x);	//経路圧縮
		return diff_weight[x];
	}
	int diff(int x,int y){
		return weight(y)-weight(x);
	}
};

void Main()
{
	int n, m;
	cin >> n >> m;
	vector<pair<int, int>> p(m);
	for (int i=0; i<m; ++i) {
		cin >> p.at(i).first >> p.at(i).second;
	}

	sort(p.begin(), p.end(), greater<pair<int, int>>());
	int res = 0, rm = n;
	for (int i=0; i<m; ++i) {
		if (rm >= p.at(i).second) {
			++res;
			rm = p.at(i).first;
		}
	}
	COUT(res);
	return;
}


int main()
{
	std::cin.tie(0);
	std::ios_base::sync_with_stdio(false);
	std::cout << std::fixed << std::setprecision(15);
	Main();
}


Measured memory_bytes: 1024