二分图染色
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e4 + 5;
const int maxm = 1e5 + 5;
int ver[maxm*2], Next[maxm*2], head[maxn];
int col[maxn];
int tot, flag, white, black, ans;
inline int read()
{
int s = 0, f = 1; char ch = getchar();
while(ch < '0' || ch > '9'){ if(ch == '-') f = -1; ch = getchar(); }
while(ch >= '0' && ch <= '9'){ s *= 10; s += ch-'0'; ch = getchar(); }
return s*f;
}
void Add(int x,int y)
{
ver[++tot] = y; Next[tot] = head[x]; head[x] = tot;
}
void dfs(int x)
{
for(int i = head[x],y; i; i = Next[i]){
y = ver[i];
if(!col[y]){
col[y] = 3-col[x];
col[y] == 1 ? white++ : black++;
dfs(y);
}
else if(col[x] == col[y]) flag = 0;
}
}
int main()
{
int n, m, x, y;
n = read(); m = read();
for(int i = 1; i <= m; i++){
x = read(); y = read();
Add(x,y); Add(y,x);
}
flag = 1;
for(int i = 1; i <= n; i++){
if(!col[i]){
white = 1; black = 0;
col[i] = 1;
dfs(i);
ans += min(white,black);
}
}
if(!flag) printf("Impossible\n");
else printf("%d\n",ans);
return 0;
}