#include <bits/stdc++.h>

using namespace std;

typedef long long ll;
typedef string str;
mt19937 rnd(157);

#define all(a) a.begin(), a.end()
#define int long long


vector<vector<int>> g;
vector<vector<int>> gr;

vector<int> topsort;
vector<int> used;
vector<int> col;
vector<int> roflused;

void rofldfs(int v) {
    roflused[v] = 1;
    for(int u : g[v]) {
        if(!roflused[u]) {
            rofldfs(v);
        }   
    }
    for(int u : gr[v]) {
        if(!roflused[u]) {
            rofldfs(u);
        }
    }
}


void dfs(int v) {
    used[v] = 1;
    for(int u : g[v]) {
        if(!used[u]) {
            dfs(u);
        }
    }
    topsort.push_back(v);
}

void cdfs(int v) {
    for(int u : g[v]) {
        if(col[u] == 0) {
            col[u] = col[v];
            cdfs(u);
        }
    }
}

signed main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

#ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif

    int n, m, ah;
    cin >> n >> m >> ah;

    g.resize(n);
    gr.resize(n);
    for(int i = 0; i < n; i++) {
        int u, v;
        cin >> u >> v;
        u--;
        v--;
        g[u].push_back(v);
        gr[v].push_back(u);
    }
    
    roflused.resize(n, 0);
    int roflcnt = 0;
    for(int i = 0; i < n; i++) {
        if(!roflused[i]) {
            roflcnt++;
            rofldfs(i);
        }
    }
    cout << m - n + roflcnt << endl << 1 << endl;
//    used.resize(n, 0);
//    for(int i = 0; i < n; i++) {
//        if(!used[i]) {
//            dfs(i);
//        }
//    }
//    reverse(all(topsort));
//
//    int c = 1;
//    for(int i = 0; i < n; i++) {
//        if(col[i] == 0) {
//            col[i] = c++;
//            cdfs(i);
//        }
//    }


}
