#include <bits/stdc++.h>
using namespace std;
 
#define FAST_IO                  \
    ios::sync_with_stdio(false); \
    cin.tie(nullptr);
 
struct EdmondsKarp {
    struct Edge {
        int to, rev, cap;
    };
 
    int n;
    vector<vector<Edge>> g;
 
    EdmondsKarp(int n = 0)
        : n(n), g(n) {}
 
    void addEdge(int v, int u, int c) {
        Edge a { u, (int)g[u].size(), c };
        Edge b { v, (int)g[v].size(), 0 };
        g[v].push_back(a);
        g[u].push_back(b);
    }
 
    int maxflow(int s, int t) {
        int flow = 0;
 
        while (true) {
            vector<int> pv(n, -1), pe(n, -1);
            queue<int> q;
 
            pv[s] = s;
            q.push(s);
 
            while (!q.empty() && pv[t] == -1) {
                int v = q.front();
                q.pop();
 
                for (int i = 0; i < (int)g[v].size(); ++i) {
                    Edge& e = g[v][i];
 
                    if (e.cap <= 0 || pv[e.to] != -1) {
                        continue;
                    }
 
                    pv[e.to] = v;
                    pe[e.to] = i;
                    q.push(e.to);
 
                    if (e.to == t) {
                        break;
                    }
                }
            }
 
            if (pv[t] == -1) {
                break;
            }
 
            int add = INT_MAX;
 
            for (int v = t; v != s; v = pv[v]) {
                Edge& e = g[pv[v]][pe[v]];
                add = min(add, e.cap);
            }
 
            for (int v = t; v != s; v = pv[v]) {
                Edge& e = g[pv[v]][pe[v]];
                e.cap -= add;
                g[e.to][e.rev].cap += add;
            }
 
            flow += add;
        }
 
        return flow;
    }
};
 
int main() {
    FAST_IO;
 
    int N, P;
    cin >> N >> P;
 
    const int INF = 1'000'000'000;
 
    auto IN = [](int x) {
        return x * 2;
    };
 
    auto OUT = [](int x) {
        return x * 2 + 1;
    };
 
    EdmondsKarp mf(2 * N + 2);
 
    for (int city = 1; city <= N; ++city) {
        if (city == 1 || city == 2) {
            mf.addEdge(IN(city), OUT(city), INF);
        } else {
            mf.addEdge(IN(city), OUT(city), 1);
        }
    }
 
    for (int i = 0; i < P; ++i) {
        int a, b;
        cin >> a >> b;
 
        mf.addEdge(OUT(a), IN(b), INF);
        mf.addEdge(OUT(b), IN(a), INF);
    }
 
    cout << mf.maxflow(OUT(1), IN(2)) << '\n';
 
    return 0;
}