#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 7;
long long read() {
  long long res = 0, f = 1;
  char c = getchar();
  while (!isdigit(c) && c != '-') c = getchar();
  if (c == '-') f = -1, c = getchar();
  while (isdigit(c)) res = (res << 1) + (res << 3) + c - 48, c = getchar();
  return res * f;
}
bool ck(int x, int s) { return s & (1 << x); }
long long f[20][maxn];
int e[20][20];
int n, m, q;
struct node {
  int x, y;
} E[maxn];
struct kkk {
  int x, y, z;
} a[maxn];
long long dp(int x, int s) {
  if (f[x][s] != -1) return f[x][s];
  f[x][s] = 0;
  int now = s ^ (1 << x), p = 0;
  for (; p < n; p++)
    if (now & (1 << p)) break;
  for (int t = now; t; t = (t - 1) & now) {
    if (!(t & (1 << p))) continue;
    int bl = 0;
    for (int i = 1; i <= q; i++)
      if (a[i].z == x && ck(a[i].x, t) && ck(a[i].y, t)) bl = 1;
    if (bl) continue;
    for (int i = 1; i <= q; i++)
      if (ck(a[i].z, t) && (!ck(a[i].x, t) || !ck(a[i].y, t))) bl = 1;
    if (bl) continue;
    for (int i = 1; i <= m; i++)
      if (E[i].x != x && E[i].y != x && (ck(E[i].x, t) ^ ck(E[i].y, t))) bl = 1;
    if (bl) continue;
    int tp = 0;
    for (int i = 0; i < n; i++)
      if (e[i][x] && ck(i, t)) {
        bl++;
        tp = i;
      }
    if (bl > 1) continue;
    if (bl)
      f[x][s] += dp(tp, t) * dp(x, s ^ t);
    else
      for (int i = 0; i < n; i++)
        if (ck(i, t)) f[x][s] += dp(i, t) * dp(x, s ^ t);
  }
  return f[x][s];
}
int main() {
  n = read(), m = read(), q = read();
  for (int i = 1; i <= m; i++) {
    int x = E[i].x = read() - 1, y = E[i].y = read() - 1;
    e[x][y] = e[y][x] = 1;
  }
  for (int i = 1; i <= q; i++)
    a[i].x = read() - 1, a[i].y = read() - 1, a[i].z = read() - 1;
  memset(f, -1, sizeof f);
  for (int i = 0; i < n; i++) f[i][1 << i] = 1;
  long long ans = dp(0, (1 << n) - 1);
  printf("%lld\n", ans);
  return 0;
}
