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 = 5e5 + 7;
int prel[N], prer[N];
void ini(char str[], int pre[]) {
  int n = strlen(str), tmp = -1;
  pre[0] = -1;
  for (int i = (1); i < (n); ++i) {
    for (; ~tmp && str[tmp + 1] != str[i]; tmp = pre[tmp])
      ;
    pre[i] = tmp += (str[tmp + 1] == str[i]);
  }
}
int n, m, k;
char s[N], t[N];
int dpl[N], dpr[N];
void ok(int l, int r) {
  printf("Yes\n%d %d", l, r);
  exit(0);
}
void gao(int dp[], int pre[]) {
  ini(t, pre);
  int cur = -1;
  for (int i = (0); i < (n); ++i) {
    while (~cur && t[cur + 1] != s[i]) cur = pre[cur];
    cur += (t[cur + 1] == s[i]);
    dp[i] = cur;
    if (cur == m - 1) {
      if (k >= m) {
        if (n - 1 - i >= k) ok(max(1, i + 1 - k + 1), n - k + 1);
        if (i - m >= k - 1) ok(1, min(n - k + 1, i + 1 - m + 1));
      }
      cur = pre[cur];
    }
  }
}
int pos[N];
void add(int p) {
  p = n - 1 - p;
  for (int tmp = dpr[p]; ~tmp; tmp = prer[tmp]) {
    if (~pos[tmp]) break;
    pos[tmp] = n - 1 - p;
  }
}
int bel[N];
int main() {
  scanf("%d%d%d", &n, &m, &k);
  scanf(" %s %s", s, t);
  gao(dpl, prel);
  reverse(s, s + n);
  reverse(t, t + m);
  gao(dpr, prer);
  fill_n(pos, m, -1);
  fill_n(bel, m, -1);
  for (int i = (k - 1); i < (n - k); ++i) {
    for (int j = dpl[i]; ~j; j = prel[j]) {
      if (~bel[j]) break;
      bel[j] = i;
    }
  }
  for (int i = (n - k) - 1; i >= (k - 1); --i) {
    add(i + 1);
    for (int j = dpl[i]; ~j; j = prel[j]) {
      if (bel[j] != i) break;
      if (j == m - 1 || j >= k || m - 1 - j - 1 >= k || !~pos[m - 1 - j - 1])
        continue;
      ok(i + 1 - k + 1, pos[m - 1 - j - 1] + 1);
    }
  }
  puts("No");
  return 0;
}
