#include <iostream>
#include <queue>
#include <vector>
using namespace std;

vector< pair<int,int> >
find_maximum_matching(
        int A,
        int B,
        const vector< pair<int,int> > &edge_list)
{
    vector< vector<int> > BA;
    BA.resize(B);
    for (const auto &e : edge_list) BA[ e.second ].push_back( e.first );
    vector<int> match(A,-1);
    for (int b=0; b<B; ++b) {
        vector<int> from(A,-1);
        queue<int> Q;
        for (int a : BA[b]) { Q.push(a); from[a]=a; }
        while (!Q.empty()) {
            int a = Q.front(); Q.pop();
            if (match[a] == -1) {
                while (from[a] != a) { match[a] = match[from[a]]; a = from[a]; }
                match[a] = b;
                break;
            } else {
                for (int x : BA[match[a]]) if (from[x]==-1) { Q.push(x); from[x]=a; }
            }
        }
    }
    vector< pair<int,int> > result;
    for (int a=0; a<A; ++a) if (match[a] != -1) result.push_back( { a, match[a] } );
    return result;
}

int main() {
    vector< pair<int,int> > edge_list = { {0,0}, {0,1}, {0,2}, {1,0}, {2,0} };
    cout << find_maximum_matching(3, 3, edge_list).size() << endl;
}