#include <bits/stdc++.h>
using namespace std;
long long getint() {
  long long _x = 0, _tmp = 1;
  char _tc = getchar();
  while ((_tc < '0' || _tc > '9') && _tc != '-') _tc = getchar();
  if (_tc == '-') _tc = getchar(), _tmp = -1;
  while (_tc >= '0' && _tc <= '9') _x *= 10, _x += (_tc - '0'), _tc = getchar();
  return _x * _tmp;
}
long long mypow(long long _a, long long _x, long long _mod) {
  if (_x == 0) return 1ll;
  long long _tmp = mypow(_a, _x / 2, _mod);
  _tmp = (_tmp * _tmp) % _mod;
  if (_x & 1) _tmp = (_tmp * _a) % _mod;
  return _tmp;
}
long long add(long long _x, long long _y, long long _mod = 1000000007ll) {
  long long _ = _x + _y;
  if (_ >= _mod) _ -= _mod;
  return _;
}
long long sub(long long _x, long long _y, long long _mod = 1000000007ll) {
  long long _ = _x - _y;
  if (_ < 0) _ += _mod;
  return _;
}
long long mul(long long _x, long long _y, long long _mod = 1000000007ll) {
  long long _ = _x * _y;
  if (_ >= _mod) _ %= _mod;
  return _;
}
bool equal(double _x, double _y) { return _x > _y - 1e-9 && _x < _y + 1e-9; }
int __ = 1, cs;
int n, m, q;
bool fb[14][1 << 14];
vector<int> v[14];
int son[14], rd[14];
void build() {}
void init() {
  n = getint();
  m = getint();
  q = getint();
  while (m--) {
    int ui = getint();
    int vi = getint();
    v[ui].push_back(vi);
    v[vi].push_back(ui);
    rd[ui] |= (1 << (vi - 1));
    rd[vi] |= (1 << (ui - 1));
  }
  while (q--) {
    int ai = getint();
    int bi = getint();
    int ci = getint();
    son[ci] |= (1 << (ai - 1));
    son[ci] |= (1 << (bi - 1));
    for (int i = 0; i < (1 << n); i++)
      if (((i >> (ai - 1)) & 1) && ((i >> (bi - 1)) & 1)) fb[ci][i] = true;
  }
  for (int i = 1; i <= n; i++)
    for (int j = 0; j < (int)v[i].size(); j++)
      for (int k = j + 1; k < (int)v[i].size(); k++)
        for (int msk = 0; msk < (1 << n); msk++)
          if (((msk >> (v[i][j] - 1)) & 1) && ((msk >> (v[i][k] - 1)) & 1))
            fb[i][msk] = true;
}
long long dp[14][1 << 14];
bool got[14][1 << 14];
long long DP(int now, int msk, int prt, bool fir, int tmp) {
  tmp &= (~(1 << (prt - 1)));
  if ((tmp & msk) != tmp) return 0;
  if (fir && (msk & son[now]) != son[now]) return 0;
  if (got[now][msk]) return dp[now][msk];
  got[now][msk] = true;
  if (msk == (msk & (-msk))) return dp[now][msk] = 1;
  msk &= (~(1 << (now - 1)));
  for (int i = 1; i <= n; i++)
    if ((msk >> (i - 1)) & 1) {
      long long tans = 0;
      for (int tmsk = msk; tmsk; tmsk = (tmsk - 1) & msk) {
        if (fb[now][tmsk]) continue;
        if (((tmsk >> (i - 1)) & 1) == 0) continue;
        for (int j = 1; j <= n; j++)
          if ((tmsk >> (j - 1)) & 1)
            tans += DP(j, tmsk, now, true, rd[j]) *
                    DP(now, (msk ^ tmsk) | (1 << (now - 1)), prt, false,
                       tmp & (~(1 << (j - 1))));
      }
      return dp[now][msk | (1 << (now - 1))] = tans;
    }
  return 0;
}
void solve() { printf("%lld\n", DP(1, (1 << n) - 1, 1, true, rd[1])); }
int main() {
  build();
  while (__--) {
    init();
    solve();
  }
}
