#include <bits/stdc++.h>
using namespace std;
int n, m, q;
long long dp[15][(1 << 13) + 10][15];
struct E {
  int a, b;
} e[20];
struct Lca {
  int a, b, c;
} lca[100 + 10];
int num[(1 << 13) + 10];
bool il(int u, int state, int last) {
  for (int i = 1; i <= q; i++) {
    int xx = ((state >> lca[i].a - 1) & 1) + ((state >> lca[i].b - 1) & 1) +
             ((state >> lca[i].c - 1) & 1);
    if (xx == 2 && (u != lca[i].c || last == 0))
      return true;
    else if (xx == 1 && ((state >> lca[i].c - 1) & 1) && last == 0)
      return true;
    else if (xx == 3 && (u == lca[i].a || u == lca[i].b) && u != lca[i].c)
      return true;
  }
  for (int i = 1; i <= m; i++) {
    int xx = ((state >> e[i].a - 1) & 1) + ((state >> e[i].b - 1) & 1);
    if (xx == 1 && u != e[i].a && u != e[i].b) return true;
  }
  return false;
}
long long dfs(int u, int state, int last) {
  if (dp[u][state][last] != -1) return dp[u][state][last];
  dp[u][state][last] = 0;
  if (il(u, state, last)) return dp[u][state][last];
  if (num[state] == 1) {
    return dp[u][state][last] = 1;
  }
  int full = state ^ (1 << u - 1);
  for (int x = full; x; x = (x - 1) & full) {
    int ok = true;
    int y = full ^ x;
    for (int i = 1; i <= m; i++) {
      if ((((x >> (e[i].a - 1)) & 1) && ((y >> (e[i].b - 1)) & 1)) ||
          (((y >> (e[i].a - 1)) & 1) && ((x >> (e[i].b - 1)) & 1))) {
        ok = false;
        break;
      }
    }
    if (!ok) continue;
    for (int i = last + 1; i <= n; i++)
      if ((x >> (i - 1)) & 1)
        dp[u][state][last] += dfs(u, y | (1 << u - 1), i) * dfs(i, x, 0);
  }
  return dp[u][state][last];
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d", &e[i].a, &e[i].b);
  }
  for (int i = 1; i <= q; i++) {
    scanf("%d%d%d", &lca[i].a, &lca[i].b, &lca[i].c);
  }
  for (int i = 0; i < (1 << n); i++) {
    int x = i;
    while (x) {
      num[i] += x & 1;
      x >>= 1;
    }
  }
  memset(dp, -1, sizeof(dp));
  printf("%I64d\n", dfs(1, (1 << n) - 1, 0));
  return 0;
}
