#include <iostream>
using namespace std;
const int maxn = 1000 + 10;
int edge[maxn][maxn];
int mark[maxn], d[maxn];
int n, m;

int find_min()
{
  int ret = -1; // we dont know who has the minimum degree
  for(int i=0;i<n;++i)
    if(mark[i] == 0)
      if(ret == -1 || d[ret] > d[i]) // i has less degree than ret
	ret = i;
  return ret;
}

void delete_node(int id)
{
  mark[id] = 1; // deleting id
  for(int i=0;i<n;++i)
    d[i] -= edge[id][i];
}

int main()
{
  cin >> n >> m;
  for(int i=0;i<m;++i) {
    int u, v;
    cin >> u >> v;
    u--; // we are 0 base
    v--;
    d[u]++;
    d[v]++;
    edge[u][v]++; // multiple edges!!!
    edge[v][u]++;
  }

  int ans = 0;
  for(int t=0;t<n;++t) {
    int id = find_min(); // find id of the vertex with minimum degree
    ans = max(ans, d[id]); // this induced subgraph may be the answer
    delete_node(id); // delete this node
  }

  cout << ans << endl;

  return 0;
}