#include <bits/stdc++.h>
using namespace std;
#ifdef _LOCAL
#define debug(x) cerr << __LINE__ << ' ' << __PRETTY_FUNCTION__ << ": " << x << '\n';
#else
#define debug(...) 238;
#endif
mt19937 rng(238);
mt19937_64 rng64(238);
using ll = long long;
template <typename T, int U>
using ar = array<T, U>;
template <typename T, typename U>
bool chmin(T& x, const U&& y) {
    if (x > y) {
        x = y;
        return true;
    }
    return false;
}
template <typename T, typename U>
bool chmax(T& x, const U&& y) {
    if (x < y) {
        x = y;
        return true;
    }
    return false;
}

#include <ext/pb_ds/assoc_container.hpp>
template <typename T>
using ordered_set = __gnu_pbds::tree<T, __gnu_pbds::null_type,
                                     less<T>,
                                     __gnu_pbds::rb_tree_tag,
                                     __gnu_pbds::tree_order_statistics_node_update>; 

constexpr int Inf = 0x3f3f3f3f;
constexpr ll  inf = 0x3f3f3f3f3f3f3f3f;

const int maxn = 2005;
array<vector<int>, maxn> g;

bool verify(int v, int u) {
    if (v == u) {
        return true;
    }
    for (int k : g[v]) {
        if (verify(k, u)) {
            return true;
        }
    }
    return false;
}

void solve() {
    int n, m, gr;
    cin >> n >> m >> gr;
    vector<pair<int, int>> edges;
    for (int v, u, i = 0; i < m; ++i) {
        cin >> v >> u;
        --v, --u;
        g[v].push_back(u);
        edges.emplace_back(v, u);
    }

    int ans = 0;
    for (auto [v, u] : edges) {
        g[v].erase(find(g[v].begin(), g[v].end(), u));
        if (verify(v, u)) {
            ans++;
        }
        g[v].push_back(u);
    }

    assert(ans == m - n + 1);
    cout << ans << '\n' << -1;
}

int main() {
#ifdef _LOCAL
    freopen("test.in", "r", stdin);
    freopen("test.out", "w", stdout);
#endif
    cin.tie(0)->sync_with_stdio(0);

    int Tc = 1;
    // cin >> Tc;
    while (Tc--) {
        solve();
        cout << '\n';
    }

    return 0;
}