#include <bits/stdc++.h>
using namespace std;
int mod = 998244353;
int sum(int a, int b) {
  int c = a + b;
  if (c >= mod) {
    c -= mod;
  }
  return c;
}
int dif(int a, int b) {
  int c = a - b;
  if (c < 0) {
    c += mod;
  }
  return c;
}
int mlt(int a, int b) {
  long long c = a * 1LL * b;
  return c % mod;
}
int ibit(int n, int i) { return ((n >> i) & 1); }
void outp1(vector<long long> &ou, string s = " ") {
  cerr << s << endl;
  for (int i = 0; i < ou.size(); i++) {
    cerr << ou[i] << ' ';
  }
  cerr << endl;
}
void outp1(vector<int> &ou, string s = " ") {
  cerr << s << endl;
  for (int i = 0; i < ou.size(); i++) {
    cerr << ou[i] << ' ';
  }
  cerr << endl;
}
void outp2(vector<vector<int>> &ou, string s = " ") {
  cerr << s << endl;
  for (int i = 0; i < ou.size(); i++) {
    for (int j = 0; j < ou[i].size(); j++) {
      cerr << ou[i][j] << ' ';
    }
    cerr << '\n';
  }
}
int bp(int x, int y) {
  if (y == 0) {
    return 1;
  }
  int a = 0;
  if (!(y % 2)) {
    a = bp(x, y / 2);
  }
  return (y % 2) ? mlt(bp(x, y - 1), x) : mlt(a, a);
}
int obr(int x) { return bp(x, mod - 2); }
const int maxn = 301;
int fact[maxn], ofact[maxn];
void prec() {
  fact[0] = 1;
  ofact[0] = 1;
  for (int i = 1; i < maxn; i++) {
    fact[i] = mlt(fact[i - 1], i);
  }
  ofact[maxn - 1] = obr(fact[maxn - 1]);
  for (int i = maxn - 2; i > 0; i--) {
    ofact[i] = mlt(ofact[i + 1], i + 1);
  }
}
int c(int a, int b) {
  return ((a <= b) && (a >= 0)) ? mlt(fact[b], mlt(ofact[a], ofact[b - a])) : 0;
}
int inf = 1e9 + 110;
int slv(vector<pair<int, int>> &edges, int mask, vector<int> &perm, int n,
        bool cool) {
  if (n == 7 && mask == 63) return 0;
  vector<int> cols(n);
  cols[perm[0]] = 0;
  for (int i = 1; i < n; i++) {
    cols[perm[i]] = cols[perm[i - 1]];
    if (ibit(mask, i - 1)) cols[perm[i]]++;
  }
  vector<vector<int>> used(6, vector<int>(6));
  for (auto ed : edges) {
    used[cols[ed.first]][cols[ed.second]]++;
    used[cols[ed.second]][cols[ed.first]]++;
  }
  int cur = 0;
  for (int i = 0; i < 6; i++) {
    for (int j = 0; j < i; j++) {
      if (used[i][j] >= 1) cur++;
    }
    if (used[i][i]) cur++;
  }
  return cur;
}
void solve(istream &cin = std::cin, ostream &cout = std::cout) {
  int n, m;
  cin >> n >> m;
  vector<pair<int, int>> edges;
  for (int i = 0; i < m; i++) {
    int x, y;
    cin >> x >> y;
    x--;
    y--;
    edges.push_back({x, y});
  }
  vector<int> v(n);
  for (int i = 0; i < n; i++) v[i] = i;
  int fact = 1;
  for (int i = 1; i <= n; i++) fact *= i;
  int ans = 0;
  for (int i = 0; i < fact; i++) {
    for (int mask = 0; mask < (1 << (n - 1)); mask++) {
      bool cool = false;
      ans = max(ans, slv(edges, mask, v, n, cool));
    }
    next_permutation(v.begin(), v.end());
  }
  cout << ans << '\n';
}
int main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  int tests = 1;
  for (int i = 0; i < tests; i++) solve();
}
