#include <bits/stdc++.h>
using namespace std;
namespace io {
char ibuf[(1 << 20)], *iS, *iT, obuf[(1 << 20)],
    *oS = obuf, *oT = oS + (1 << 20) - 1, c, qu[55];
int f, qr;
inline void flush(void) {
  return fwrite(obuf, 1, oS - obuf, stdout), oS = obuf, void();
}
inline char getch(void) {
  return (iS == iT ? (iT = (iS = ibuf) + fread(ibuf, 1, (1 << 20), stdin),
                      (iS == iT ? EOF : *iS++))
                   : *iS++);
}
inline void putch(char x) {
  *oS++ = x;
  if (oS == oT) flush();
  return;
}
string getstr(void) {
  string s = "";
  char c = getch();
  while (c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == EOF)
    c = getch();
  while (!(c == ' ' || c == '\n' || c == '\r' || c == '\t' || c == EOF))
    s.push_back(c), c = getch();
  return s;
}
void putstr(string str, int begin = 0, int end = -1) {
  if (end == -1) end = str.size();
  for (register int i = begin; i < end; i++) putch(str[i]);
  return;
}
template <typename T>
inline T read() {
  register T x = 0;
  for (f = 1, c = getch(); c < '0' || c > '9'; c = getch())
    if (c == '-') f = -1;
  for (x = 0; c <= '9' && c >= '0'; c = getch()) x = x * 10 + (c & 15);
  return x * f;
}
template <typename T>
inline void write(const T& t) {
  register T x = t;
  if (!x) putch('0');
  if (x < 0) putch('-'), x = -x;
  while (x) qu[++qr] = x % 10 + '0', x /= 10;
  while (qr) putch(qu[qr--]);
  return;
}
struct Flusher_ {
  ~Flusher_() { flush(); }
} io_flusher_;
}  // namespace io
using io::getch;
using io::getstr;
using io::putch;
using io::putstr;
using io::read;
using io::write;
struct LCA {
  int lca, x, y;
};
long long f[13][(1 << 13)];
int n, m, q;
vector<pair<int, int> > edges;
vector<LCA> lca;
long long F(int p, int S) {
  if (~f[p][S]) return f[p][S];
  S ^= 1 << p;
  int sp = 0;
  while (!(S >> sp & 1)) sp++;
  f[p][S ^ (1 << p)] = 0;
  for (register int i = S; i; i = (i - 1) & S) {
    if (!(i >> sp & 1)) continue;
    bool pass = false;
    for (vector<LCA>::iterator j = lca.begin(); j != lca.end(); j++)
      if (j->lca == p && (i >> j->x & 1) && (i >> j->y & 1)) pass = true;
    if (pass) continue;
    for (vector<LCA>::iterator j = lca.begin(); j != lca.end(); j++)
      if ((i >> j->lca & 1) && (!(i >> j->x & 1) || !(i >> j->y & 1)))
        pass = true;
    if (pass) continue;
    for (vector<pair<int, int> >::iterator j = edges.begin(); j != edges.end();
         j++)
      if (j->first != p && j->second != p &&
          ((i >> j->first & 1) ^ (i >> j->second & 1)))
        pass = true;
    if (pass) continue;
    bool choose = false;
    int ppp = 0;
    for (vector<pair<int, int> >::iterator j = edges.begin(); j != edges.end();
         j++)
      if (j->first == p && (i >> j->second & 1))
        choose ? pass = true : (choose = true, ppp = j->second);
      else if (j->second == p && (i >> j->first & 1))
        choose ? pass = true : (choose = true, ppp = j->first);
    if (pass) continue;
    if (choose)
      f[p][S ^ (1 << p)] += F(ppp, i) * F(p, S ^ i ^ (1 << p));
    else
      for (register int j = 0; j < n; j++)
        if (i >> j & 1) f[p][S ^ (1 << p)] += F(j, i) * F(p, S ^ i ^ (1 << p));
  }
  return f[p][S ^ (1 << p)];
}
int main() {
  memset(f, -1, sizeof(f));
  n = read<int>(), m = read<int>(), q = read<int>();
  while (m--)
    edges.push_back((pair<int, int>){read<int>() - 1, read<int>() - 1});
  while (q--) {
    int a = read<int>() - 1, b = read<int>() - 1, c = read<int>() - 1;
    lca.push_back((LCA){c, a, b});
  }
  for (register int i = 0; i < n; i++) f[i][1 << i] = 1;
  write(F(0, (1 << n) - 1)), putch('\n');
  return 0;
}
