#include <bits/stdc++.h>
using namespace std;
const int MQ = 105, MN = 15, MS = (1 << 13) + 10, MS3 = 1.6e6, INF = 1e9 + 10;
struct trip {
  int a, b, c;
} qr[MQ];
int n, m, q;
vector<int> adj[MN];
bool valid[MN][MS3], seen[MN];
long long dp[MN][MS];
int p3[MN], es[MN], ee[MN];
void init() {
  cin >> n >> m >> q;
  for (int i = 0; i < m; ++i) {
    int a, b;
    cin >> a >> b;
    --a, --b;
    es[i] = a, ee[i] = b;
    adj[a].push_back(b), adj[b].push_back(a);
  }
  for (int i = 0; i < n; ++i) sort(adj[i].begin(), adj[i].end());
  for (int i = 0; i < q; ++i) {
    int a, b, c;
    cin >> a >> b >> c;
    --a, --b, --c;
    qr[i] = {a, b, c};
    if (a == b && a != c) {
      cout << 0 << '\n';
      exit(0);
    }
  }
}
bool A[MN], B[MN];
void make(int msk) {
  memset(A, 0, sizeof A), memset(B, 0, sizeof B);
  for (int i = 0; i < n; ++i) {
    int t = msk % 3;
    if (t == 1)
      A[i] = true;
    else if (t == 2)
      B[i] = true;
    msk /= 3;
  }
}
void prep_valid() {
  p3[0] = 1;
  for (int i = 1; i < MN; ++i) p3[i] = 3 * p3[i - 1];
  for (int msk = 0; msk < p3[n]; ++msk) {
    make(msk);
    bool Fail = false;
    int lst = -1;
    for (int i = 0; i < q; ++i) {
      int x = qr[i].a, y = qr[i].b;
      if (!A[x]) swap(x, y);
      if (A[x] && B[y]) {
        if (~lst && qr[i].c != lst) {
          Fail = true;
        }
        lst = qr[i].c;
      }
    }
    if (!Fail) {
      if (~lst)
        valid[lst][msk] = true;
      else {
        for (int i = 0; i < n; ++i)
          if (!A[i] || !B[i]) valid[i][msk] = true;
      }
    }
  }
}
void solve() {
  for (int msk = 1; msk < (1 << n); ++msk) {
    if (__builtin_popcount(msk) == 1) {
      dp[__builtin_ctz(msk)][msk] = 1;
      continue;
    }
    int M = (msk - 1) & msk;
    while (M) {
      int T = 0, Sv = 0;
      for (int i = 0; i < n; ++i)
        if (msk & 1 << i) {
          if (M & 1 << i)
            T += p3[i];
          else
            T += 2 * p3[i];
        }
      Sv = T;
      make(T);
      int cnt = 0;
      pair<int, int> lst = {-1, -1};
      for (int i = 0; i < m; ++i) {
        if (!A[es[i]]) swap(es[i], ee[i]);
        if (A[es[i]] && B[ee[i]]) ++cnt, lst = {es[i], ee[i]};
      }
      if (cnt == 1) {
        T = 0;
        for (int i = 0; i < n; ++i)
          if (M & 1 << i) {
            if (i ^ lst.first)
              T += p3[i];
            else
              T += 2 * p3[i];
          }
        bool F = true;
        for (auto x : adj[lst.second])
          if (msk & 1 << x) {
            if (x ^ lst.first) F = false;
            break;
          }
        if (valid[lst.first][T] && valid[lst.second][Sv] && F)
          dp[lst.second][msk] += dp[lst.first][M] * dp[lst.second][msk ^ M];
      } else if (!cnt) {
        memset(seen, 0, sizeof seen);
        for (int i = 0; i < m; ++i)
          if (B[es[i]] && B[ee[i]]) seen[es[i]] = seen[ee[i]] = true;
        long long sm = 0;
        T = 0;
        int lst_ = -1;
        for (int i = 0; i < n; ++i)
          if (M & 1 << i) T += 2 * p3[i];
        for (int rt2 = 0; rt2 < n; ++rt2)
          if (M & 1 << rt2) {
            if (~lst_)
              T += p3[lst_] - p3[rt2];
            else
              T -= p3[rt2];
            lst_ = rt2;
            if (valid[rt2][T]) sm += dp[rt2][M];
          }
        for (int rt = 0; rt < n; ++rt)
          if (!seen[rt] && ((msk ^ M) & (1 << rt)))
            if (valid[rt][Sv] &&
                __builtin_ctz(M) == __builtin_ctz(msk ^ (1 << rt))) {
              dp[rt][msk] += sm * dp[rt][msk ^ M];
            }
      }
      M = (M - 1) & msk;
    }
  }
  cout << dp[0][(1 << n) - 1] << '\n';
}
int main() {
  ios_base ::sync_with_stdio(false), cin.tie(0), cout.tie(0);
  init();
  prep_valid();
  solve();
  return 0;
}
