1 #include <iostream>
2 #include <algorithm>
3 #include <cstring>
4 using namespace std;
5
6 struct Edge
7 {
8 int n;
9 int next;
10 }edge[100010];
11
12 int head[10010];
13 int cnt;
14 bool vis[10010];
15 int cla[10010];
16 int sum[2];
17
18 void add(int a, int b)
19 {
20 cnt++;
21 edge[cnt].n = b;
22 edge[cnt].next = head[a];
23 head[a] = cnt;
24 }
25
26 bool dfs(int num, int c)
27 {
28 if (vis[num])
29 {
30 if (cla[num] == c) return true;
31 return false;
32 }
33 vis[num] = true;
34 sum[c]++;
35 cla[num] = c;
36 bool flag = true;
37 for (int i = head[num]; i && flag; i = edge[i].next)
38 {
39 if (!dfs(edge[i].n, 1 - c)) flag = false;
40 }
41 return flag;
42 }
43
44 int main()
45 {
46 int n;
47 cin >> n;
48 int m;
49 cin >> m;
50 for (int i = 0; i < m; i++)
51 {
52 int a, b;
53 cin >> a >> b;
54 add(a, b);
55 add(b, a);
56 }
57 int ans = 0;
58 for (int i = 1; i <= n; i++)
59 {
60 memset(sum, 0, sizeof(sum));
61 if (vis[i]) continue;
62 if (!dfs(i, 0))
63 {
64 cout << "Impossible";
65 return 0;
66 }
67 ans += min(sum[0], sum[1]);
68 }
69 cout << ans;
70 }