#include <bits/stdc++.h> // NeOWami
using namespace std;
#define ft first
#define sc second
const int N = 37;
int n, m, ans = -1;
vector<int> G[N];
namespace sub1{
bool TT[N];
bool checksub() {
if (n <= 21) return 1;
return 0;
}
bool check() {
for (int i = 1; i <= n; i++) if (!TT[i]) return 0;
return 1;
}
void solve() {
for (int msk = 0; msk < (1 << n); msk++) {
for (int i = 1; i <= n; i++) TT[i] = 0;
for (int i = 1; i <= n; i++) if (msk >> (i - 1) & 1) {
TT[i] = !TT[i];
for (int v: G[i]) TT[v] = !TT[v];
}
if (check()) {
if (ans == -1 || ans > __builtin_popcount(msk)) ans = __builtin_popcount(msk);
}
}
cout << ans;
}
}///
namespace subfull{
// Meet in the middle
/*
1 -> n/ 2;
n/2 + 1 -> n;
*/
using ll = long long;
using pli = pair<ll, int>;
int HPT[N][N];
void solve() {
int mid = n / 2;
for (int i = 1; i <= n; i++) {
HPT[i][i] = 1;
for (int j: G[i]) HPT[i][j] = 1;
}
/*
x1 | x2 | x3 | x4 | x5...
HPT[i][j] xét tới Phương trình thứ i và hệ số của xj
1: i = 1; 1 * x1 + 1 * x2 + 1 * x3 + 0 * x4 + 0 * x5
*/
// tập trái:
int len1 = mid;
vector<pli> LeftGroup;
// n = 5; mid = n / 2 = 2
// TT; 1 -> 2 (1 -> mid) (mid - 1 + 1) = mod
// TP; 3 -> 5
for (int msk = 0; msk < (1 << len1); msk++) {
ll mskOfHPT = 0;
for (int i = 1; i <= n; i++) {
int val = 0;
for (int light = 1; light <= mid; light++) if (msk >> (light - 1) & 1) {
val = (val + HPT[i][light] * 1) % 2;
}
mskOfHPT |= (val * 1LL << (i - 1));
}
LeftGroup.push_back({mskOfHPT, __builtin_popcount(msk)});
}
sort(LeftGroup.begin(), LeftGroup.end());
// 1 * x1 + 1 * x2 + 1 * x3 + 0 * x4 + 0 * x5 = 1 (mod 2);
// 1 * x1 + 1 * x2 + 1 * x3 = 1 - (+ 0 * x4 + 0 * x5) (mod 2);
// tập phải: mid + 1 -> n
int len2 = (n - (mid + 1) + 1);
vector<pli> RightGroup;
for (int msk = 0; msk < (1 << len2); msk++) {
ll mskOfHPT = 0;
for (int i = 1; i <= n; i++) {
int val = 1;
for (int light = mid + 1; light <= n; light++) if (msk >> (light - (mid + 1)) & 1) {
val = (val + HPT[i][light] * 1) % 2;
}
mskOfHPT |= (val * 1LL << (i - 1));
}
RightGroup.push_back({mskOfHPT, __builtin_popcount(msk)});
}
sort(RightGroup.begin(), RightGroup.end());
for (pli item: LeftGroup) {
// item = {hpt, val}
// itemPhai = {item.ft, nhỏ nhất có thể};
//{{3, 5}, {5, 1}};
// {4, -1};
int id = lower_bound(RightGroup.begin(), RightGroup.end(), (pli){item.ft, -1}) - RightGroup.begin();
if (id < RightGroup.size()) {
pli item2 = RightGroup[id];
if (item2.ft == item.ft) {
int sum = item.sc + item2.sc;
if (ans == -1 || ans > sum) ans = sum;
}
}
}
cout << ans;
}
}///
signed main() {
cin.tie(NULL)->sync_with_stdio(false);
if(ifstream("Input.inp")) {
freopen("Input.inp", "r", stdin);
freopen("Output.out", "w", stdout);
}
cin >> n >> m;
for (int i = 1; i <= m; i++) {
int u, v; cin >> u >> v;
G[u].push_back(v);
G[v].push_back(u);
}
if (sub1::checksub()) return sub1::solve(), 0;
return subfull::solve(), 0;
return 0;
}