#include <bits/stdc++.h>
const int MAXN = 13;
int n, m, q;
long long f[MAXN + 5][1 << MAXN];
std::vector<int> adj[MAXN + 5];
std::vector<std::pair<int, int> > dif[MAXN + 5];
inline bool check(const int r, const int T) {
  for (std::pair<int, int> p : dif[r]) {
    if (((T >> p.first) & 1) && ((T >> p.second) & 1)) {
      return false;
    }
  }
  for (int u = 0; u < n; ++u) {
    if (!((T >> u) & 1)) continue;
    for (std::pair<int, int> p : dif[u]) {
      if (!((T >> p.first) & 1) || !((T >> p.second) & 1)) {
        return false;
      }
    }
  }
  for (int u = 0; u < n; ++u) {
    if (u == r) continue;
    for (int v : adj[u]) {
      if (v ^ r && ((T >> u) & 1) ^ ((T >> v) & 1)) {
        return false;
      }
    }
  }
  int cnt = 0;
  for (int u : adj[r]) cnt += ((T >> u) & 1);
  return cnt <= 1;
}
inline long long solve(const int r, int S) {
  long long& ret = f[r][S];
  if (~ret) return ret;
  ret = 0, S ^= 1 << r;
  int p;
  for (p = 0; p < n && !((S >> p) & 1); ++p)
    ;
  for (int T = S; T; T = (T - 1) & S) {
    if (!((T >> p) & 1) || !check(r, T)) continue;
    for (int u = 0; u < n; ++u) {
      if (!((T >> u) & 1)) continue;
      ret += solve(u, T) * solve(r, S ^ T ^ (1 << r));
    }
  }
  return ret;
}
int main() {
  scanf("%d %d %d", &n, &m, &q);
  for (int i = 1, u, v; i <= m; ++i) {
    scanf("%d %d", &u, &v), --u, --v;
    adj[u].push_back(v), adj[v].push_back(u);
  }
  for (int i = 1, u, v, w; i <= q; ++i) {
    scanf("%d %d %d", &u, &v, &w), --u, --v, --w;
    dif[w].push_back({u, v});
  }
  memset(f, 0xff, sizeof f);
  for (int u = 0; u < n; ++u) f[u][1 << u] = 1;
  printf("%lld\n", solve(0, (1 << n) - 1));
  return 0;
}
