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;
const int N = 1e6 + 10;
const int INF = 0x3f3f3f3f;
const double PI = acos(-1.0);
const double eps = 1e-10;
const int M = 1e9 + 7;
int f[N], mt;
char a[N], b[N];
int fa[N], fb[N];
int vis[N];
void getFail(char *P) {
  int m = strlen(P);
  f[0] = 0;
  f[1] = 0;
  for (int i = 1; i < m; i++) {
    int j = f[i];
    while (j && P[i] != P[j]) j = f[j];
    f[i + 1] = P[i] == P[j] ? j + 1 : 0;
  }
}
void find(char *T, char *P, int *fa) {
  int n = strlen(T), m = strlen(P);
  getFail(P);
  for (int i = 0, j = 0; i < n; i++) {
    while (j && P[j] != T[i]) j = f[j];
    if (P[j] == T[i]) j++;
    while (j > mt) j = f[j];
    fa[i] = j;
  }
}
void add(int k) {
  while (!vis[k]) {
    vis[k] = 1;
    k = f[k];
  }
}
bool ok(int i, int j) {
  while (vis[i]) {
    if (i == j) return true;
    vis[i] = 0;
    i = f[i];
  }
  return false;
}
int main() {
  int n, m, k;
  scanf("%d %d %d", &n, &m, &k);
  scanf("%s %s", a, b);
  mt = k;
  find(a, b, fa);
  int la = strlen(a), lb = strlen(b);
  reverse(a, a + la);
  reverse(b, b + lb);
  find(a, b, fb);
  reverse(fb, fb + la);
  bool f = 0;
  for (int i = 0; i < la; i++) {
    if (fa[i] == lb) {
      puts("Yes");
      f = 1;
      int st = i - k + 1;
      if (st < 0) st = 0;
      if (st + 2 * k > la) st = la - 2 * k;
      printf("%d %d\n", st + 1, st + k + 1);
      break;
    }
  }
  for (int i = la - k - 1; i >= k - 1 && !f; i--) {
    add(fb[i + 1]);
    if (vis[lb - fa[i]]) {
      puts("Yes");
      f = 1;
      printf("%d ", i - k + 1 + 1);
      for (int j = i + 1; j < la; j++) {
        if (ok(fb[j], lb - fa[i])) {
          printf("%d\n", j + 1);
          break;
        }
      }
    } else if (fb[i + 1] == lb) {
      f = 1;
      puts("Yes");
      printf("%d %d\n", i - k + 1 + 1, i + 1);
    }
  }
  if (!f) puts("No");
  return 0;
}
