#include <bits/stdc++.h>
using namespace std;
int n, m, q, u[105], v[105], a[105], b[105], c[105], bt[1 << 13];
long long f[13][1 << 13];
bool check(int x, int y, int s) {
  for (int i = 1; i <= m; i++)
    if (1 & (s >> u[i])) {
      if (!(1 & (s >> v[i]))) {
        if (y != u[i] || x != v[i]) return false;
      }
    }
  for (int i = 1; i <= m; i++)
    if (1 & (s >> v[i])) {
      if (!(1 & (s >> u[i]))) {
        if (y != v[i] || x != u[i]) return false;
      }
    }
  return true;
}
bool calc(int s) {
  for (int i = 1; i <= q; i++) {
    if (((s >> b[i]) & 1) && ((s >> a[i]) & 1) && !((s >> c[i]) & 1))
      return false;
    if (((s >> c[i]) & 1) && (!((s >> a[i]) & 1) || !((s >> b[i]) & 1)))
      return false;
  }
  return true;
}
long long solve(int x, int s) {
  if (~f[x][s]) return f[x][s];
  if (0 == (1 & (s >> x))) return f[x][s] = 0;
  if (s == (s & -s)) return f[x][s] = 1;
  f[x][s] = 0;
  int res = s ^ (1 << x);
  int hav = bt[res & -res];
  res ^= 1 << hav;
  for (int y = 0; y <= n - 1; y++) {
    if (check(x, y, 1 << hav) && calc(1 << hav))
      f[x][s] += solve(y, 1 << hav) * solve(x, s ^ (1 << hav));
    for (int t = res; t; t = (t - 1) & res) {
      if (check(x, y, (1 << hav) | t) && calc((1 << hav) | t))
        f[x][s] += solve(y, (1 << hav) | t) * solve(x, s ^ (1 << hav) ^ t);
    }
  }
  return f[x][s];
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  bt[0] = ~0;
  for (int i = 1; i <= (1 << n) - 1; i++) bt[i] = bt[i >> 1] + 1;
  for (int i = 1; i <= m; i++) scanf("%d%d", &u[i], &v[i]), u[i]--, v[i]--;
  for (int i = 1; i <= q; i++)
    scanf("%d%d%d", &a[i], &b[i], &c[i]), a[i]--, b[i]--, c[i]--;
  memset(f, ~0, sizeof(f));
  printf("%lld\n", solve(0, (1 << n) - 1));
  return 0;
}
