#include <bits/stdc++.h>
using namespace std;
const int maxN = 15;
const int maxM = 15;
const int maxQ = 107;
const int maxS = 8199;
template <class T>
inline T rd() {
  bool f = 1;
  char c = getchar();
  for (; !isdigit(c); c = getchar())
    if (c == '-') f = 0;
  T x = 0;
  for (; isdigit(c); c = getchar()) x = x * 10 + c - 48;
  return f ? x : -x;
}
int n, m, q;
struct piii {
  int x, y, z;
} lca[maxQ];
struct pii {
  int x, y;
} edg[maxN];
struct vec {
  static const int maxE = maxN;
  int g[maxN], te;
  struct edge {
    int y, nxt;
  } e[maxE << 1];
  inline void push(int x, int y) { e[++te] = (edge){y, g[x]}, g[x] = te; }
  inline void link(int x, int y) { push(x, y), push(y, x); }
  inline int& operator()(int x) { return g[x]; }
  inline edge& operator[](int x) { return e[x]; }
} e;
long long f[maxS][maxN];
bool ok(int S, int T, int rt) {
  for (int i = (1), _ = (q); i <= _; ++i) {
    int x = lca[i].x, y = lca[i].y;
    if ((S >> (x - 1) & 1) && (T >> (y - 1) & 1))
      if (lca[i].z != rt) return 0;
    if ((S >> (y - 1) & 1) && (T >> (x - 1) & 1))
      if (lca[i].z != rt) return 0;
  }
  return 1;
}
int lnk(int S, int T, int rt) {
  int res = 0;
  for (int i = (1), _ = (m); i <= _; ++i) {
    int x = edg[i].x, y = edg[i].y;
    if ((S >> (x - 1) & 1) && (T >> (y - 1) & 1)) {
      if (x != rt) return -1;
      ++res;
    }
    if ((S >> (y - 1) & 1) && (T >> (x - 1) & 1)) {
      if (y != rt) return -1;
      ++res;
    }
  }
  return res;
}
int main() {
  n = rd<int>(), m = rd<int>(), q = rd<int>();
  for (int i = (1), _ = (m); i <= _; ++i) {
    int x = rd<int>(), y = rd<int>();
    e.link(x, y);
    edg[i] = (pii){x, y};
  }
  for (int i = (1), _ = (q); i <= _; ++i) {
    int x = rd<int>(), y = rd<int>(), z = rd<int>();
    lca[i] = (piii){x, y, z};
    if (x == y && z != x) {
      puts("0");
      return 0;
    }
  }
  int mask = (1 << n) - 1;
  for (int i = (1), _ = (n); i <= _; ++i) f[1 << (i - 1)][i] = 1;
  for (int U = (1), _ = (mask); U <= _; ++U)
    if (U != (U & -U))
      for (int x = (1), _ = (n); x <= _; ++x)
        if (U >> (x - 1) & 1) {
          for (int _ = U, S = _; S; (--S) &= _)
            if (S >> (x - 1) & 1) {
              int T = U ^ S;
              if (T == 0) continue;
              if (S != (S & -S) && S > (T | (1 << (x - 1)))) continue;
              if (!ok(S, T, x)) continue;
              int cnt = lnk(S, T, x);
              if (cnt == -1 || cnt >= 2) continue;
              if (cnt == 0) {
                for (int y = (1), _ = (n); y <= _; ++y)
                  if (T >> (y - 1) & 1) f[U][x] += f[S][x] * f[T][y];
              } else {
                for (int p = e(x), y = e[p].y; p; y = e[p = e[p].nxt].y)
                  if (T >> (y - 1) & 1) f[U][x] += f[S][x] * f[T][y];
              }
            }
        }
  printf("%I64d\n", f[mask][1]);
  return 0;
}
