#include <bits/stdc++.h>
using namespace std;
void read(long long &x) {
  x = 0;
  long long f = 1;
  char c = getchar();
  while (c < '0' || c > '9') {
    if (c == '-') f = -f;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    x = (x << 1) + (x << 3) + c - '0';
    c = getchar();
  }
  x *= f;
  return;
}
vector<long long> G[605], st, ed;
long long f[605][605], in[605], out[605], far[605][605], Mod;
bool vis[605];
long long n, m;
long long qkpow(long long a, long long k) {
  long long ret = 1;
  while (k) {
    if (k & 1) ret = ret * a % Mod;
    k >>= 1;
    a = a * a % Mod;
  }
  return ret % Mod;
}
void dfs(long long u) {
  vis[u] = 1;
  if (!out[u]) far[u][u] = 1;
  for (int i = 0; i < G[u].size(); i++) {
    long long v = G[u][i];
    if (!vis[v]) dfs(v);
    for (int j = 0; j < ed.size(); j++)
      far[u][ed[j]] = (far[u][ed[j]] + far[v][ed[j]]) % Mod;
  }
}
long long Gauss() {
  long long ret = 1;
  long long fk = 1;
  for (int i = 1; i <= ed.size(); i++) {
    long long kt = i;
    while (kt < n - 1 && !f[kt][i]) kt++;
    if (kt != i) fk = -fk;
    swap(f[kt], f[i]);
    for (int j = i + 1; j <= ed.size(); j++)
      if (j != i) {
        long long t = Mod - f[j][i] * qkpow(f[i][i], Mod - 2) % Mod;
        for (long long k = i; k <= ed.size(); k++) {
          f[j][k] = (f[j][k] + (f[i][k] * t) % Mod) % Mod;
        }
      }
  }
  for (int i = 1; i <= st.size(); i++) ret = ret * f[i][i] % Mod;
  if (fk == -1) ret = -ret;
  return (ret % Mod + Mod) % Mod;
}
int main() {
  read(n), read(m), read(Mod);
  for (int i = 1; i <= m; i++) {
    long long u, v;
    read(u), read(v);
    G[u].push_back(v);
    out[u]++;
    in[v]++;
  }
  for (int i = 1; i <= n; i++) {
    if (!in[i]) st.push_back(i);
    if (!out[i]) ed.push_back(i);
  }
  for (int i = 1; i <= n; i++)
    if (!in[i]) dfs(i);
  for (int i = 0; i < st.size(); i++)
    for (int j = 0; j < ed.size(); j++) f[i + 1][j + 1] = far[st[i]][ed[j]];
  printf("%lld", Gauss() % Mod);
  return 0;
}
