#include <bits/stdc++.h>
using namespace std;
const int maxn = 15;
const int maxs = 10000;
const int maxq = 100 + 10;
int n, m, q;
long long d[maxn][maxs];
int edge[maxn][maxn];
int a[maxq], b[maxq], c[maxq];
int lowbit(int x) { return x & (-x); }
int in(int i, int S) { return ((S >> i) & 1); }
long long DP(int u, int S) {
  long long& ans = d[u][S];
  if (ans != -1) return ans;
  ans = 0;
  int St = S - (1 << u);
  int t;
  for (t = 0; t < n; t++)
    if (in(t, St)) break;
  for (int _S = St; _S; _S = (_S - 1) & St)
    if (in(t, _S)) {
      bool flag = true;
      for (int i = 0; i < n; i++)
        if (i != u) {
          for (int j = 0; j < n; j++)
            if (j != u) {
              if (edge[i][j] && (in(i, _S) ^ in(j, _S))) {
                flag = false;
                break;
              }
            }
          if (!flag) break;
        }
      if (!flag) continue;
      int v, cnt = 0;
      for (int i = 0; i < n; i++) {
        if (edge[u][i] && in(i, _S)) {
          cnt++;
          v = i;
        }
      }
      if (cnt >= 2) continue;
      for (int i = 0; i < q; i++) {
        if (c[i] == u && in(a[i], _S) && in(b[i], _S)) {
          flag = false;
          break;
        }
        if (in(c[i], _S) && (!in(a[i], _S) || !in(b[i], _S))) {
          flag = false;
          break;
        }
      }
      if (!flag) continue;
      if (cnt == 1) {
        ans += DP(v, _S) * DP(u, S - _S);
      } else {
        for (v = 0; v < n; v++)
          if (in(v, _S)) ans += DP(v, _S) * DP(u, S - _S);
      }
    }
  return ans;
}
int main() {
  scanf("%d%d%d", &n, &m, &q);
  for (int i = 0; i < m; i++) {
    int u, v;
    scanf("%d%d", &u, &v);
    u--;
    v--;
    edge[u][v] = edge[v][u] = 1;
  }
  for (int i = 0; i < q; i++) {
    scanf("%d%d%d", a + i, b + i, c + i);
    a[i]--;
    b[i]--;
    c[i]--;
  }
  int all = (1 << n) - 1;
  memset(d, -1, sizeof(d));
  for (int i = 0; i < n; i++) d[i][1 << i] = 1;
  printf("%I64d\n", DP(0, all));
  return 0;
}
