#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0, f = 1, ch = getchar();
  while (ch < '0' || ch > '9') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x = x * 10 + ch - '0';
    ch = getchar();
  }
  return x * f;
}
inline void write(long long x) {
  if (x < 0) putchar('-'), x = -x;
  if (x >= 10) write(x / 10);
  putchar(x % 10 + '0');
}
inline void writeln(long long x) {
  write(x);
  puts("");
}
const long long N = 13, Q = 105;
struct pp {
  long long u, v, lca;
} a[Q];
struct ed {
  long long u, v;
} e[N];
long long n, m, q, dp[N][1 << N], edge[N][N];
inline void init() {
  n = read();
  m = read();
  q = read();
  for (long long i = 1; i <= m; i++) {
    long long u = read() - 1, v = read() - 1;
    e[i] = (ed){u, v};
    edge[u][v] = edge[v][u] = 1;
  }
  for (long long i = 1; i <= q; i++) {
    a[i] = (pp){read() - 1, read() - 1, read() - 1};
  }
}
long long dfs(long long u, long long S) {
  if (~dp[u][S]) return dp[u][S];
  long long &ans = dp[u][S];
  long long pos;
  S -= (1 << u);
  ans = 0;
  for (long long i = 0; i < n; i++) {
    if (S & (1 << i)) pos = i;
  }
  for (long long S1 = S; S1; S1 = (S1 - 1) & S) {
    if (S1 & (1 << pos)) {
      bool flag = 1;
      long long cnt = 0, v;
      for (long long i = 1; i <= q; i++) {
        if ((a[i].lca == u && S1 & (1 << a[i].u) && S1 & (1 << a[i].v)) ||
            (S1 & (1 << a[i].lca) &&
             (!(S1 & (1 << a[i].u)) || !(S1 & (1 << a[i].v))))) {
          flag = 0;
          break;
        }
      }
      if (!flag) continue;
      for (long long i = 1; i <= m; i++) {
        if (e[i].u != u && e[i].v != u &&
            ((S1 & (1 << e[i].u)) > 0) ^ ((S1 & (1 << e[i].v)) > 0)) {
          flag = 0;
          break;
        }
      }
      if (!flag) continue;
      for (long long i = 0; i < n; i++) {
        if (edge[u][i] && (1 << i) & S1) {
          ++cnt;
          v = i;
        }
      }
      if (cnt > 1) continue;
      if (cnt == 1)
        ans += dfs(v, S1) * dfs(u, S ^ S1 ^ (1 << u));
      else {
        for (long long v = 0; v < n; v++) {
          if ((1 << v) & S1) {
            ans += dfs(v, S1) * dfs(u, S ^ S1 ^ (1 << u));
          }
        }
      }
    }
  }
  return ans;
}
inline void solve() {
  memset(dp, -1, sizeof dp);
  for (long long i = 0; i < n; i++) dp[i][1 << i] = 1;
  writeln(dfs(0, (1 << n) - 1));
}
signed main() {
  init();
  solve();
  return 0;
}
