Jenya has recently acquired quite a useful tool — k-scissors for cutting strings. They are generally used for cutting out two non-intersecting substrings of length k from an arbitrary string s (its length should be at least 2·k in order to perform this operation) and concatenating them afterwards (preserving the initial order). For example, with the help of 2-scissors you can cut ab and de out of abcde and concatenate them into abde, but not ab and bc since they're intersecting.

It's a nice idea to test this tool before using it in practice. After looking through the papers, Jenya came up with two strings s and t. His question is whether it is possible to apply his scissors to string s such that the resulting concatenation contains t as a substring?

Input

The first line contains three integers n, m, k (2 ≤ m ≤ 2·k ≤ n ≤ 5·105) — length of s, length of t and the aforementioned scissors' parameter correspondingly.

The next two lines feature s and t consisting of lowercase latin letters.

Output

If there is no answer, print «No». 

Otherwise print «Yes» and two integers L and R denoting the indexes where cutted substrings start (1-indexed). If there are several possible answers, output any.

Examples

Input

7 4 3
baabaab
aaaa


Output

Yes
1 5


Input

6 3 2
cbcbcb
bcc


Output

Yes
2 5


Input

7 5 3
aabbaaa
aaaaa


Output

No

Note

In the first sample case you can cut out two substrings starting at 1 and 5. The resulting string baaaab contains aaaa as a substring.

In the second sample case the resulting string is bccb.
#include <bits/stdc++.h>
using namespace std;
int get() {
  char ch;
  while (ch = getchar(), (ch < '0' || ch > '9') && ch != '-')
    ;
  if (ch == '-') {
    int s = 0;
    while (ch = getchar(), ch >= '0' && ch <= '9') s = s * 10 + ch - '0';
    return -s;
  }
  int s = ch - '0';
  while (ch = getchar(), ch >= '0' && ch <= '9') s = s * 10 + ch - '0';
  return s;
}
const int N = 1e6 + 5;
int n, m, k;
char s[N], t1[N], t2[N];
pair<int, int> ans;
bool pd;
int nxt1[N], nxt2[N];
int d1[N], d2[N];
int lef[N], rig[N];
int key2[N], key1[N];
void getkey1(int x, int v) {
  key1[x] = v;
  for (int y = lef[x]; y; y = rig[y])
    if (!key1[y]) getkey1(y, v);
}
void solve() {
  int pw = -1;
  for (int i = 1; i <= n; i++)
    if (d1[i] == m) {
      pd = 1;
      pw = i;
      break;
    }
  if (pd) {
    pw = max(1, pw - 2 * k + 1);
    ans = make_pair(pw, pw + k);
    return;
  }
  for (int i = 1; i <= m; i++) {
    rig[i] = lef[nxt1[i]];
    lef[nxt1[i]] = i;
  }
  for (int i = n - k; i >= k; i--) {
    int x = i + 1;
    int u = d2[x];
    for (; !key2[u]; u = nxt2[u]) {
      key2[u] = x;
      getkey1(m - u, x);
    }
    u = d1[i];
    if (key1[u]) {
      pd = 1;
      ans = make_pair(i - k + 1, key1[u]);
      return;
    }
  }
}
int main() {
  n = get();
  m = get();
  k = get();
  scanf("%s", s + 1);
  scanf("%s", t1 + 1);
  for (int j = 1; j <= m; j++) t2[j] = t1[m - j + 1];
  int w = 0;
  for (int i = 2; i <= m; i++) {
    while (w && t1[w + 1] != t1[i]) w = nxt1[w];
    if (t1[w + 1] == t1[i]) w++;
    nxt1[i] = w;
  }
  w = 0;
  for (int i = 2; i <= m; i++) {
    while (w && t2[w + 1] != t2[i]) w = nxt2[w];
    if (t2[w + 1] == t2[i]) w++;
    nxt2[i] = w;
  }
  w = 0;
  for (int i = 1; i <= n; i++) {
    while (w && t1[w + 1] != s[i]) w = nxt1[w];
    if (t1[w + 1] == s[i]) w++;
    while (w > k) w = nxt1[w];
    d1[i] = w;
  }
  w = 0;
  for (int i = n; i >= 1; i--) {
    while (w && t2[w + 1] != s[i]) w = nxt2[w];
    if (t2[w + 1] == s[i]) w++;
    while (w > k) w = nxt2[w];
    d2[i] = w;
  }
  pd = 0;
  solve();
  if (pd)
    printf("Yes\n%d %d\n", ans.first, ans.second);
  else
    printf("No\n");
  return 0;
}
