using namespace std;
int Map[302][302],len[303];
int N,ans,a[302];
void Tree(int x)
{
if (!a[x]) {
len[x]=1;//记录i为顶点有多小个孩子
return;
}
for (int i=1;i<=a[x];i++){
Tree(Map[x][i]);
len[x]+=len[Map[x][i]];
}
len[x]++;
}
void Chear(int x)
{
if (!a[x]) return;
int maxn=len[Map[x][1]],p=1;
for (int i=2;i<=a[x];i++)
if (len[Map[x][i]]>maxn){
maxn=len[Map[x][i]];
p=i;
}
ans-=maxn;
for (int i=1;i<=a[x];i++)
if (i!=p)
Chear(Map[x][i]);
}
int main()
{
int c;
cin>>N>>c;
memset(a,0,sizeof(a));
memset(len,0,sizeof(len));
for (int i=1;i<=c;i++){
int x,y;cin>>x>>y;
Map[x][++a[x]]=y;
}
Tree(1);
ans=len[1];
Chear(1);
cout<<ans<<endl;
return 0;
}
#include<fstream>
#include<iostream>
#include<climits>
#define debug
#undef debug
using namespace std;
#define fin cin
#define fout cout
#define MAXN 300
//ifstream fin ("epidemic.in");
//ofstream fout ("epidemic.out");
int n,p,m,x,y,t;
int a[MAXN+1],b[MAXN+1],c[MAXN+1];
void solve(int x,int y){
if(y>=m) return;
if(x==t) m=y;
else{
int j=0;
for (int i=1;i<=n;++i)
if (a[i]>0&&c[i]==x+1){
b[i]=b[a[i]];
if(b[i]==1)++j;
}
--j;
for (int i=1;i<=n;++i)
if (a[i]>0&&c[i]==x+1&&b[i]==1){
b[i]=2;
solve(x+1,y+j);
b[i]=1;
}
solve(x+1,y+j+1);
}
}
int main (void){
bool fixeddd;
memset(a,0,sizeof(a));
memset(b,0,sizeof(b));
fin>>n>>p;
b[1]=1;
for (int i=1;i<=p;++i){
fin>>x>>y;
if (b[x]==0&&b[y]==0){
a[x]=y;
a[y]=x;
}
else{
if (b[x]==1){
a[y]=x;
b[y]=1;
}
else if (b[y]==1){
a[x]=y;
b[x]=1;
}
do{
fixeddd=true;
for (int j=1;j<=n;++j)
if (a[j]>0&&b[j]==0&&b[a[j]]==1){
fixeddd=false;
b[j]=1;
break;
}
}while (!fixeddd);
}
}
memset(c,0,sizeof(c));
c[1]=1;
t=0;
do{
fixeddd=true;
++t;
for (int j=1;j<=n;++j)
if (a[j]>0&&c[a[j]]==t){
fixeddd=false;
c[j]=t+1;
}
}while(!fixeddd);
m=INT_MAX;
memset(b,0,sizeof(b));
b[1]=1;
solve(1,1);
fout<<m<<endl;
#ifdef debug
while(1);
#endif
return 0;
}