#include<bits/stdc++.h>
using namespace std ;
#define F first
#define S second
const int N = 2e5+5 ;
const int M = 2e5+5 ;
int n , m , nxt[M] , vis[M] , ans[M] , tim[N] , cnt[N] , mp[N] ;
vector<pair<int,int>> vp ;
vector<int> v[N] , nei[M] ;
set<pair<int,int>> st ;
void dfs(int node){
vis[node]=1 ;
if(tim[vp[node].F]) st.erase(st.find({tim[vp[node].F],-vp[node].F})) ;
tim[vp[node].F]+=nxt[node]-node ;
st.insert({tim[vp[node].F],-vp[node].F}) ;
ans[node]=-st.rbegin()->S ;
for(int i:nei[node]) dfs(i) ;
st.erase(st.find({tim[vp[node].F],-vp[node].F})) ;
tim[vp[node].F]-=nxt[node]-node ;
if(tim[vp[node].F]) st.insert({tim[vp[node].F],-vp[node].F}) ;
}
int main(){
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0) ;
cin >> n >> m ;
vp.resize(m) ;
for(int i=0 ; i<m ; i++){
cin >> vp[i].F >> vp[i].S ;
v[vp[i].F].push_back(i) ;
v[vp[i].S].push_back(i) ;
}
for(int i=0 ; i<m ; i++){
int temp = upper_bound(v[vp[i].F].begin(),v[vp[i].F].end(),i)-v[vp[i].F].begin() ;
if(temp==v[vp[i].F].size()) nxt[i]=m ;
else nxt[i]=v[vp[i].F][temp] ;
}
for(int i=0 ; i<m ; i++){
if(nxt[i]!=-1) nei[nxt[i]].push_back(i) ;
}
for(int i=m-1 ; i>=0 ; i--){
if(!vis[i]) dfs(i) ;
}
for(int i=0 ; i<m ; i++) cnt[ans[i]]++ ;
for(int i=0 ; i<n ; i++) cout << cnt[i] << ' ' ;
cout << '\n' ;
return 0 ;
}