#include <bits/stdc++.h>
#define int long long
using namespace std;
using i32 = int32_t;
using i64 = int64_t;
using ui32 = uint32_t;
using ui64 = uint64_t;
int t;
#define string int
string dp[100005];
#undef string
namespace strdp {
void init() {
}
const int N = 1e5;
vector<int> g[N + 5];
int dfn[N + 5], low[N + 5], c, qf[N + 5], c2, w[N + 5], sz[N + 5];
stack<int> t;
vector<int> res[N + 5];
bool vis[N + 5];
void tarjan(int x) {
dfn[x] = low[x] = ++c;
sz[x] = 1;
t.push(x);
for (int i : g[x]) {
if (!dfn[i]) {
tarjan(i);
low[x] = min(low[x], low[i]);
} else if (!qf[i]) low[x] = min(low[x], dfn[i]);
}
if (dfn[x] == low[x]) {
qf[x] = x;
while (t.top() != x) {
qf[t.top()] = x;
++sz[x];
t.pop();
}
t.pop();
}
}
vector<int> g2[N + 5];
int in[N + 5], out[N + 5], dp[N + 5], mod, dis[N + 5];
void ts(int n) {
queue<int> s;
for (int i = 1; i <= n; i++) {
if (qf[i] == i && in[i] == 0) {
s.push(i);
dis[i] = sz[i];
dp[i] = 1;
}
}
while (!s.empty()) {
int u = s.front();
s.pop();
for (int v : g2[u]) {
if (dis[v] < dis[u] + sz[v]) dis[v] = dis[u] + sz[v], dp[v] = dp[u];
else if (dis[v] == dis[u] + sz[v]) dp[v] = (dp[v] + dp[u]) % mod;
if (--in[v] == 0) {
s.push(v);
}
}
}
}
vector<pair<int, int>> g3, g4;
void main(const int &cas) {
int n, m, ans0 = 0, ans1 = 0;
cin >> n >> m >> mod;
for (int i = 1; i <= m; i++) {
int u, v;
cin >> u >> v;
g[u].push_back(v);
g3.push_back({u, v});
}
for (int i = 1; i <= n; i++) {
if (!dfn[i]) {
tarjan(i);
}
}
for (int i = 1; i <= n; i++) vis[qf[i]] = 1;
for (auto [i, j] : g3) {
int u = qf[i], v = qf[j];
if (u != v) {
g4.push_back({u, v});
}
}
sort(g4.begin(), g4.end());
auto it = unique(g4.begin(), g4.end());
g4.erase(it, g4.end());
for (auto [i, j] : g4) g2[i].push_back(j);
ts(n);
int maxx = 0, res = 0;
for (int i = 1; i <= n; i++) maxx = max(maxx, dis[i]);
for (int i = 1; i <= n; i++) {
if (maxx == dis[i]) {
res = (res + dp[i]) % mod;
}
}
cout << maxx << "\n" << res;
}
}
i32 main() {
#ifdef multipleTestCases
cin >> t;
#else
t = 1;
#endif
for (int i = 1; i <= t; i++) {
strdp::init();
strdp::main(i);
cout << "\n";
}
return 0;
}