#include<iostream>
#include<cstring>
#include<cstdio>
#include<string>
#include<queue>
#include<algorithm>
using namespace std;
int color[100010];
int li[502];
bool book[502];
struct node{
int next,u,v;
}edge[100010];
int head[1000010];
int cnt;
int js[3];
void add(int u,int v){
edge[++cnt].v=v;
edge[cnt].u=u;
edge[cnt].next=head[u];
head[u]=cnt;
}
int n,m;
bool pd=true;
int l[1000010],r[1000010],ll,rr;
void dfs(int num){
for(int i=head[num];i;i=edge[i].next){
// cout <<edge[i].u<<" "<<edge[i].v<<endl;
if(color[edge[i].v]==0){
color[edge[i].v]=3-color[num];
if(3-color[num]==1){
ll++;
l[ll]=edge[i].v;
}else{
rr++;
r[rr]=edge[i].v;
}
dfs(edge[i].v);
}else if(color[edge[i].v]==color[edge[i].u]){
pd=false;
return;
}
}
}
bool ddfs(int u){
for(int i=head[u];i;i=edge[i].next){
if(!book[edge[i].v]){
book[edge[i].v]=1;
if(!li[edge[i].v]||ddfs(li[edge[i].v])){
li[edge[i].v]=u;
return true;
}
}
}
return false;
}
int hu(){
int ans=0;
memset(li,0,sizeof(li));
for(int u=1;u<=ll;u++){
memset(book,0,sizeof(book));
if(ddfs(l[u])){
ans++;
}
}
return ans;
}
int main(){
cin >>n>>m;
for(int i=1;i<=m;i++){
int uu,vv;
cin >>uu>>vv;
add(uu,vv);
add(vv,uu);
}
js[1]++;
color[1]=1;
dfs(1);
if(pd){
cout <<hu();
}else{
cout <<"Impossible";
}
return 0;
}