#include <bits/stdc++.h>
using namespace std;
inline long long read() {
  long long x = 0, neg = 1;
  char c = getchar();
  while (!isdigit(c)) {
    if (c == '-') neg = -1;
    c = getchar();
  }
  while (isdigit(c)) x = x * 10 + c - '0', c = getchar();
  return x * neg;
}
inline void print(long long x) {
  if (x < 0) {
    putchar('-');
    print(abs(x));
    return;
  }
  if (x <= 9)
    putchar(x + '0');
  else {
    print(x / 10);
    putchar(x % 10 + '0');
  }
}
inline long long qpow(long long x, long long e, long long _MOD) {
  long long ans = 1;
  while (e) {
    if (e & 1) ans = ans * x % _MOD;
    x = x * x % _MOD;
    e >>= 1;
  }
  return ans;
}
long long n = read(), m = read(), q = read();
long long a[105], b[105], c[105], u[15], v[15];
vector<long long> g[15];
long long dp[14][8193];
signed main() {
  for (long long i = 1; i <= m; i++)
    u[i] = read(), v[i] = read(), g[u[i]].push_back(v[i]),
    g[v[i]].push_back(u[i]);
  for (long long i = 1; i <= q; i++)
    a[i] = read(), b[i] = read(), c[i] = read();
  for (long long j = 0; j < (1 << n); j++) {
    for (long long i = 1; i <= n; i++) {
      if (__builtin_popcount(j) == 1 && (((j) >> (i - 1)) & 1)) {
        dp[i][j] = 1;
        continue;
      }
      if (!(((j) >> (i - 1)) & 1)) continue;
      long long msk = j - (1ll << (i - 1));
      long long fst = 0;
      for (long long t = 1; t <= n; t++)
        if ((((msk) >> (t - 1)) & 1)) {
          fst = t;
          break;
        }
      for (long long k = msk; k; k = msk & (k - 1)) {
        if ((((k) >> (fst - 1)) & 1)) {
          long long l = k ^ j;
          long long cnt = 0, s = 0;
          for (__typeof(g[i].begin()) it = g[i].begin(); it != g[i].end();
               it++) {
            long long p = *it;
            if ((((k) >> (p - 1)) & 1)) s = p, cnt++;
          }
          if (cnt >= 2) continue;
          bool flag = 1;
          for (long long p = 1; p <= m; p++) {
            if (u[p] == i || v[p] == i) continue;
            if ((((k) >> (u[p] - 1)) & 1) && !(((k) >> (v[p] - 1)) & 1))
              flag = 0;
            if ((((k) >> (v[p] - 1)) & 1) && !(((k) >> (u[p] - 1)) & 1))
              flag = 0;
          }
          for (long long r = 1; r <= q; r++) {
            if ((((k) >> (c[r] - 1)) & 1) &&
                (!(((k) >> (a[r] - 1)) & 1) || !(((k) >> (b[r] - 1)) & 1)))
              flag = 0;
            if (c[r] == i && (((k) >> (a[r] - 1)) & 1) &&
                (((k) >> (b[r] - 1)) & 1))
              flag = 0;
          }
          if (!flag) continue;
          if (!cnt) {
            for (long long o = 1; o <= n; o++) {
              if (i != o && (((k) >> (o - 1)) & 1))
                dp[i][j] += dp[i][l] * dp[o][k];
            }
          } else {
            dp[i][j] += dp[i][l] * dp[s][k];
          }
        }
      }
    }
  }
  cout << dp[1][(1 << n) - 1] << endl;
  return 0;
}
