1138_E. Museums Tour_21595
In the country N, there are n cities connected by m one-way roads. Although this country seems unremarkable, there are two interesting facts about it. At first, a week lasts d days here. At second, there is exactly one museum in each city of the country N.

Travel agency "Open museums" is developing a new program for tourists interested in museums. Agency's employees know which days each of the museums is open. The tour should start in the capital — the city number 1, and the first day of the tour must be on the first day of a week. Each day a tourist will be in some city, watching the exposition in its museum (in case museum is open today), and by the end of the day, the tour either ends or the tourist goes into another city connected by a road with the current one. The road system of N is designed in such a way that traveling by a road always takes one night and also all the roads are one-way. It's allowed to visit a city multiple times during the trip.

You should develop such route for the trip that the number of distinct museums, possible to visit during it, is maximum.

Input

The first line contains three integers n, m and d (1 ≤ n ≤ 100 000, 0 ≤ m ≤ 100 000, 1 ≤ d ≤ 50), the number of cities, the number of roads and the number of days in a week.

Each of next m lines contains two integers u_i and v_i (1 ≤ u_i, v_i ≤ n, u_i ≠ v_i), denoting a one-way road from the city u_i to the city v_i.

The next n lines contain the museums' schedule. The schedule of the museum located in the i-th city is described in the i-th of these lines. Each line consists of exactly d characters "0" or "1", the j-th character of the string equals to "1" if the museum is open at the j-th day of a week, and "0", otherwise.

It's guaranteed that for each pair of cities (u, v) there exists no more than one road leading from u to v.

Output

Print a single integer — the maximum number of distinct museums, that it's possible to visit, starting a trip in the first city on the first day of the week.

Examples

Input


4 5 3
3 1
1 2
2 4
4 1
2 3
011
110
111
001


Output


3


Input


3 3 7
1 2
1 3
2 3
1111111
0000000
0111111


Output


2

Note

Explanation of the first example <image>

The maximum number of distinct museums to visit is 3. It's possible to visit 3 museums, for example, in the way described below.

  * Day 1. Now it's the 1st day of a week, and the tourist is in the city 1. The museum there is closed. At night the tourist goes to the city number 2. 
  * Day 2. Now it's the 2nd day of a week, and the tourist is in the city 2. The museum there is open, and the tourist visits it. At night the tourist goes to the city number 4. 
  * Day 3. Now it's the 3rd day of a week, and the tourist is in the city 4. The museum there is open, and the tourist visits it. At night the tourist goes to the city number 1. 
  * Day 4. Now it's the 1st day of a week, and the tourist is in the city 1. The museum there is closed. At night the tourist goes to the city number 2. 
  * Day 5. Now it's the 2nd of a week number 2, and the tourist is in the city 2. The museum there is open, but the tourist has already visited it. At night the tourist goes to the city number 3. 
  * Day 6. Now it's the 3rd day of a week, and the tourist is in the city 3. The museum there is open, and the tourist visits it. After this, the tour is over. 

Explanation of the second example <image>

The maximum number of distinct museums to visit is 2. It's possible to visit 2 museums, for example, in the way described below.

  * Day 1. Now it's the 1st day of a week, and the tourist is in the city 1. The museum there is open, and the tourist visits it. At night the tourist goes to the city number 2. 
  * Day 2. Now it's the 2nd day of a week, and the tourist is in the city 2. The museum there is closed. At night the tourist goes to the city number 3. 
  * Day 3. Now it's the 3rd day of a week, and the tourist is in the city 3. The museum there is open, and the tourist visits it. After this, the tour is over. 
#include <bits/stdc++.h>
using namespace std;
ostream& operator<<(ostream& cerr, vector<long long> aux) {
  cerr << "[";
  for (auto e : aux) cerr << e << ' ';
  cerr << "]";
  return cerr;
}
struct state {
  int x, y;
  int where;
};
const int maxN = 100011;
const int maxD = 54;
const int init = 1000000000;
int n, m, d, x, y;
vector<int> adj[maxN], rev[maxN];
char open[maxN][maxD];
bool us[maxN][maxD];
int best[maxN][maxD];
stack<pair<int, int> > S;
int nxt[maxD], previous[maxD];
vector<pair<int, int> > here;
int best_here;
int cnt_vis;
bool vis[maxN];
int sol;
stack<state> dfStack;
void dfs(int x, int y) {
  int wh;
  dfStack.push({x, y, 0});
  while (!dfStack.empty()) {
    auto act = dfStack.top();
    dfStack.pop();
    x = act.x;
    y = act.y;
    wh = act.where;
    us[x][y] = true;
    while (wh < adj[x].size() && us[adj[x][wh]][nxt[y]]) wh++;
    if (wh == adj[x].size()) {
      S.push(make_pair(x, y));
      continue;
    } else {
      dfStack.push({x, y, wh + 1});
      dfStack.push({adj[x][wh], nxt[y], 0});
    }
  }
}
void dfs2(int x, int y) {
  int wh;
  dfStack.push({x, y, 0});
  while (!dfStack.empty()) {
    auto act = dfStack.top();
    dfStack.pop();
    x = act.x;
    y = act.y;
    wh = act.where;
    us[x][y] = true;
    if (wh == 0) {
      here.push_back(make_pair(x, y));
      best_here = max(best_here, best[x][y]);
      if (open[x][y] == '1' && vis[x] == false) {
        vis[x] = true;
        cnt_vis++;
      }
    }
    while (wh < rev[x].size() && us[rev[x][wh]][previous[y]]) wh++;
    if (wh == rev[x].size()) {
      continue;
    } else {
      dfStack.push({x, y, wh + 1});
      dfStack.push({rev[x][wh], previous[y], 0});
    }
  }
}
int main() {
  scanf("%d%d%d\n", &n, &m, &d);
  for (int i = 1; i <= m; i++) {
    scanf("%d%d\n", &x, &y);
    adj[x].push_back(y);
    rev[y].push_back(x);
  }
  for (int i = 1; i <= n; i++) scanf("%s\n", open[i]);
  for (int i = 0; i < d; i++) {
    nxt[i] = (i + 1) % d;
    previous[i] = (i - 1 + d) % d;
  }
  for (int i = 1; i <= n; i++) {
    for (int j = 0; j < d; j++) {
      if (us[i][j]) continue;
      dfs(i, j);
    }
  }
  memset(us, 0, sizeof(us));
  best[1][0] = init;
  while (!S.empty()) {
    auto act = S.top();
    S.pop();
    x = act.first;
    y = act.second;
    if (us[x][y]) continue;
    here.clear();
    best_here = 0;
    cnt_vis = 0;
    dfs2(x, y);
    for (auto e : here) {
      x = e.first;
      y = e.second;
      best[x][y] = best_here + cnt_vis;
      for (auto to : adj[x]) {
        best[to][nxt[y]] = max(best[to][nxt[y]], best[x][y]);
      }
      vis[x] = false;
    }
    sol = max(sol, best_here + cnt_vis);
    continue;
    cerr << best_here + cnt_vis << '\n';
    for (auto e : here) cerr << e.first << " " << e.second << '\n';
  }
  printf("%d", sol - init);
  return 0;
}
